Was ist die maximale Länge für einen C/C++-Bezeichner auf gängigen (Build-)Systemen?

Lesezeit: 4 Minuten

Benutzeravatar von mbx
mbx

Ich erinnere mich nicht, dass der Standard etwas von der maximalen Länge für Bezeichner sagt, also können sie es theoretisch sein lang. Im wirklichen Leben könnten diese Namen zumindest durch die Compiler- und Linker-Implementierungen eingeschränkt werden.

Dies sollte zwar auf allen Systemen funktionieren

int a;

dieser Ausschnitt

#!/usr/bin/perl
print "int" . "b" x 2**16 . ";";

erstellt eine Deklaration, die einen undefinierten Verweis auf gibt std::etwas mit ld beim Kompilieren/Linken (mit gcc/mingw).

Was sind also die Größenbeschränkungen für eine Kennung auf verschiedenen Systemen?

  • Seien Sie gewarnt, dass Längenbeschränkungen für Namen gelten verstümmelte Namen. Ich wurde viel Zeit von einigen lästigen Warnungen von MSVC geschlagen, als ich Vorlagenfunktionen schrieb und ihnen einige übergab boost::transform_iterator<whatever_very_long_iterator_type, even_longer_huge_functor_from_boost_lambda>. Der verstümmelte Name der Instanziierung wird einfach wahnsinnig lang.

    – Alexander C.

    22. Mai 2011 um 9:54 Uhr


  • @Alexandre: Bis jetzt hatte ich das Problem nie. Das einzige Problem im Zusammenhang mit Vorlagen, an das ich mich erinnere, war, dass ich die Vorlagentiefe in einigen Projekten erhöhen musste, die Meta-Programmierung verwendeten.

    – mbx

    22. Mai 2011 um 10:07 Uhr


  • gcc hat kein solches Problem (siehe Antwort von @Anders). Dies ist nur eine Warnung, die gelegentlich bei MS-Tools auftritt, wenn die verstümmelten Namen 2048 Zeichen überschreiten. Es verwüstet Ihre Builds jedoch normalerweise nicht.

    – Alexander C.

    22. Mai 2011 um 11:05 Uhr

Benutzeravatar von Anders Lindahl
Anders Lindahl

  • Microsoft C++: 2048 Zeichen
  • Intel-C++: 2048 Zeichen
  • g++: Keine Begrenzung, wie in dieser Frage beantwortet: Gibt es eine Längenbegrenzung für g++-Variablennamen?

Anhang B des C++-Standards besagt, dass eine Implementierung Bezeichner mit einer Länge von mindestens 1024 Zeichen unterstützen sollte, dies ist jedoch nicht zwingend erforderlich.

  • Ein Wort zur Vorsicht, diese Länge identifiziert das verstümmelte Symbol, wenn ich mich recht erinnere. Funktionen, die Template-Klassen als Argumente verwenden, können ziemlich haarige, verstümmelte Namen bekommen, daher ist die Grenze nicht so weit hergeholt.

    – Matthias M.

    15. Mai 2011 um 16:14 Uhr

  • @Matthieu Nicht offensichtlich. Soweit mir bekannt ist, geht der Standard nicht auf Namensverstümmelung ein.

    Benutzer2100815

    15. Mai 2011 um 16:18 Uhr

  • @Neil: Ich glaube nicht, dass jeder Compiler seine eigene ABI entwickeln kann (und sollte) (oder wenn Sie die einer anderen wiederverwenden, stellen Sie sicher, dass der produzierte Code wirklich kompatibel ist). Ich wollte nur die Tatsache ansprechen, dass der Standard eine Länge für die Werkzeugkette angibt, diese sich jedoch von der auf einem Linker angegebenen Länge unterscheidet, da ein Linker nur entstellte (verzierte) Symbole sieht.

    – Matthias M.

    15. Mai 2011 um 17:59 Uhr

  • Sollte Klingt so, als ob es bei älteren Compilern/Linkern einige Fallstricke geben könnte.

    – mbx

    22. Mai 2011 um 16:51 Uhr

  • @mbx Sie können C++-Code nicht von verschiedenen Compilern oder sogar von verschiedenen Compiler-Versionen verknüpfen. Das ist der Preis, den Sie für typsichere Verknüpfungen zahlen, die sich meiner Meinung nach lohnen.

    Benutzer2100815

    22. Mai 2011 um 16:58 Uhr

Benutzeravatar von SpongeBob
SpongeBob

Basierend auf MISRA C 2004:

Regel 5.1 (erforderlich): Bezeichner (intern und extern) dürfen sich nicht auf die Bedeutung von mehr als 31 Zeichen verlassen.
[Undefined 7; Implementation 5, 6]
Der ISO-Standard verlangt, dass interne Identifikatoren in den ersten 31 Zeichen eindeutig sind, um die Portierbarkeit des Codes zu gewährleisten. Diese Einschränkung darf nicht überschritten werden, auch wenn der Compiler dies unterstützt. Diese Regel gilt für alle Namensräume. Makronamen sind ebenfalls enthalten und die Beschränkung auf 31 Zeichen gilt vor und nach der Ersetzung. Der ISO-Standard verlangt, dass externe Kennungen unabhängig von der Groß- und Kleinschreibung in den ersten 6 Zeichen eindeutig sind, um eine optimale Portabilität zu gewährleisten. Diese Einschränkung ist jedoch besonders schwerwiegend und wird als unnötig angesehen. Die Absicht dieser Regel besteht darin, eine Lockerung der ISO-Anforderung in einem Maße zu sanktionieren, das modernen Umgebungen entspricht, und es soll bestätigt werden, dass die Bedeutung von 31 Zeichen/Groß-/Kleinschreibung durch die Implementierung unterstützt wird. Beachten Sie, dass es ein verwandtes Problem bei der Verwendung von Bezeichnernamen gibt, die sich nur um ein oder wenige Zeichen unterscheiden, insbesondere wenn die Bezeichnernamen lang sind. Das Problem verschärft sich, wenn die Unterschiede in leicht falsch lesbaren Zeichen wie 1 (Eins) und l (Kleinbuchstabe L), 0 und O, 2 und Z, 5 und S oder n und h bestehen. Es wird empfohlen, darauf zu achten, dass Identifikatornamen immer leicht visuell unterscheidbar sind. Spezifische Richtlinien zu diesem Thema könnten in die Stilrichtlinien aufgenommen werden (siehe Abschnitt 4.2.2).

Ich verwende diese Regel. Vielleicht fragt mich jemand “Siehst du einen Compiler, der keine Kennungen über 31 erkennen kann?” Ja, ich erinnere mich, dass ich in IAR RL78 v2.21.1 2 Bezeichner ohne Warnung und Fehler definiert habe, aber ich hatte ein Problem beim Zugriff (jetzt erinnere ich mich nicht mehr, was das genaue Szenario war).

1387660cookie-checkWas ist die maximale Länge für einen C/C++-Bezeichner auf gängigen (Build-)Systemen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy