2 Stimmen

Ist wcslen Teil der ISO/IEC 14882:2003 C++ Standardbibliothek?

Bei der Portierung eines C++-Programms von 32 auf 64 Bit unter Windows habe ich festgestellt, dass _tcslen nicht unterstützt wird und stattdessen strlen/wcslen (für Nicht-Unicode/Unicode) verwendet werden sollte. Ich begann mich zu fragen

  1. Wenn wcslen Teil der ISO/IEC 14882:2003 C++ Standardbibliothek ist. Wie ich sehe, wird diese Funktion sowohl von g++ als auch von VC++ unterstützt. Auch in offene Gruppe Ich habe einen Hinweis gefunden, der besagt The functionality described on this reference page is aligned with the ISO C standard hat aber nicht erwähnt, ob es sich um C89 oder C99 handelt.
  2. Ist irgendwo dokumentiert, dass _tcslen nicht mit Win64 kompatibel ist? Auch die MSDN-Link deutet nichts an.
  3. Kann bei Unicode wcslen versehentlich anstelle von _tcslen verwendet werden?

1 Stimmen

_tcslen ist nur ein #define für entweder wcslen o strlen je nachdem, ob _UNICODE definiert ist. Sie können jederzeit tchar.h kopieren oder eine eigene Version erstellen, damit dies auf jeder Plattform funktioniert. Wenn es nicht funktioniert, müssen Sie wahrscheinlich nur tchar.h einbinden.

3voto

Jon Punkte 411383
  1. Ja, das ist es. Tabelle 48 in Abschnitt 21.4 enthält wcslen als eine der Funktionen, die in <cwchar> .
  2. _tcslen ist auch bei der Erstellung von x64-Builds verfügbar.
  3. Solange _UNICODE definiert ist, dann _tcslen erweitert sich auf wcslen . Das Einzige, was Sie gewinnen, wenn Sie _tcslen es que theoretisch können Sie durch Umlegen eines Schalters eine ANSI-Version Ihrer Anwendung erstellen; praktisch Sie haben nichts davon (ANSI-Builds im Jahr 2012 sind einfach grauenhaft, IMHO) und es erfordert echte Arbeit, damit Ihr Build in beide Richtungen funktioniert. Ich würde es nicht empfehlen.

0 Stimmen

Danke. Das beantwortet meine erste Frage. Ich freue mich auf den restlichen Teil meiner Frage.

0 Stimmen

Ich danke Ihnen für Ihre Beiträge. Ich bin mir bewusst, dass _tcslen für ANSI/UNICODE unterschiedlich expandiert. Das Codestück, das ich mir angesehen habe, wird garantiert nur für UNICODE ausgeführt, so dass ich mich darauf gefreut habe, _tcslen sicher durch wcslen zu ersetzen.

2voto

Frerich Raabe Punkte 85859

Andere haben Ihre erste Frage bereits beantwortet (die Antwort darauf ist "ja"), also werde ich die beiden anderen Fragen beantworten:

2) _tcslen ist vollkommen kompatibel mit Win64.

3) Es wäre falsch, die wcslen anstelle von _tcslen wenn Sie sich mit einer Reihe von TCHAR Werte (z.B. LPTSTR ou LPCTSTR ), aber Sie haben keine _UNICODE definiert. Wenn _UNICODE ist nicht definiert, TCHAR erweitert sich auf char also LPTSTR es char* - die nicht an wcslen . Der Compiler kotzt also.

Siehe den Abschnitt "Bemerkungen" auf der MSDN-Seite für strlen/wcslen/... für eine Diskussion darüber, worauf sich _tcslen ausdehnt.

1voto

thb Punkte 12723

ISO/IEC 14882:2003(E), Kap. 21, Tabelle 48, S. 412. Die wcslen() ist in der Tat Teil des Standards, vorgelegt von #include <cwchar> .

In der Norm wird nicht erwähnt tcslen() ou _tcslen() . Dies scheinen Microsoft-Erweiterungen zu sein. Wenn sie mit Ihrer Zielplattform nicht kompatibel sind und nicht im Standard erwähnt werden, ist es vielleicht besser, sich an wcslen() .

Für Informationen: Symbole, die mit einem Unterstrich beginnen, stehen in der Regel für Implementierungsdetails. Durch das Voranstellen von tcslen mit einem Unterstrich, warnen die Entwickler Ihrer Toolchain Sie wahrscheinlich, dass _tcslen() könnte in einer zukünftigen Version verschwinden. Und genau das scheint bei Ihnen der Fall zu sein.

Auch ich verwende gelegentlich unterstrichene Funktionen, wenn ich keine gute Alternative habe; aber dann muss ich meinen Code aktualisieren, wenn ich die Toolchain wechsle. Normalerweise ist der Standard also das Beste.

Viel Glück!

0 Stimmen

Danke. Das beantwortet meine erste Frage. Ich freue mich auf den restlichen Teil meiner Frage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X