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?
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.
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).
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