Unklares Verhalten der Variablendeklaration in c

7

Ich habe den folgenden Code

%Vor%

Das Problem ist, wir wissen, dass der ANSI-Standard Variablen bis zu 31 Zeichen erkennt ... aber beide Variablen sind bis zu 35 Zeichen gleich ... aber das Programm kompiliert ohne Fehler und Warnung und liefert korrekte Ergebnisse ...
aber wie? sollte es nicht einen Fehler der Neueinlegung geben?

    
MD. Khairul Basar 02.11.2014, 11:49
quelle

5 Antworten

14

Viele Compiler sind so konstruiert, dass sie die ANSI-Spezifikation (zum Beispiel bei der Erkennung von Variablennamen mit mehr als 31 Zeichen) als Schutz für Programmierer übertreffen. Während es in dem Compiler funktioniert, den Sie verwenden, können Sie nicht darauf zählen, dass es in irgendeinem C-Compiler funktioniert ...

    
Zeiss Ikon 02.11.2014, 11:53
quelle
10
  

[...] wir wissen, dass der ANSI-Standard Variablen mit bis zu 31 Zeichen erkennt, [...] sollte dies nicht zu einer fehlerhaften Deklaration führen?

Nun, nicht notwendig. Da Sie ANSI C erwähnt haben, ist dies der relevante Teil des C89-Standards:

  

"Implementierungsgrenzen"

     

Die Implementierung behandelt mindestens die ersten 31 Zeichen eines internen Namens (ein Makroname oder eine Kennung, die keine externe Verknüpfung hat) als signifikant. Entsprechende Klein- und Großbuchstaben sind unterschiedlich. Die Implementierung kann die Signifikanz eines externen Namens (eines Identifikators, der eine externe Verknüpfung aufweist) auf sechs Zeichen weiter einschränken und kann die Unterscheidung von alphabetischer Groß- / Kleinschreibung für solche Namen ignorieren. 10 Diese Einschränkungen für Identifikatoren sind alle implementierungsdefiniert .

     

Alle Bezeichner, die sich in einem signifikanten Zeichen unterscheiden, sind unterschiedliche Bezeichner. Wenn sich zwei Bezeichner in einem nicht signifikanten Zeichen unterscheiden, ist das Verhalten nicht definiert. .

Ссылка (Betonung meiner)

Es wird auch explizit als gemeinsame Erweiterung beschrieben:

  

Längen und Fälle von Bezeichnern

     

Alle Zeichen in Bezeichnern (mit oder ohne externe Verknüpfung) sind signifikant und Fallunterscheidungen werden beobachtet (3.1.2)

Ссылка

Sie verwenden also nur eine C-Implementierung Ihres Compilers.

    
effeffe 02.11.2014 12:05
quelle
3

Die C89-Begründung erläutert dies :

  

3.1.2 Identifikatoren

     

Während eine Implementierung nicht verpflichtet ist, sich mehr als die erste zu erinnern   31 Zeichen eines Bezeichners zum Zweck der Namensübereinstimmung, der   es ist dem Programmierer effektiv untersagt, zwei absichtlich zu erstellen   verschiedene Bezeichner, die in den ersten 31 Zeichen identisch sind.   Implementierungen können daher die vollständige Kennung speichern; Sie sind nicht   verpflichtet, auf 31 zu kürzen.

     

Die Entscheidung, Signifikanz für interne 31 Zeichen zu erweitern   Namen wurden mit wenig Widerspruch gemacht, aber die Entscheidung, das zu behalten   alte sechs Zeichen Groß-und Kleinschreibung der Bedeutung von   Externe Namen waren am schmerzhaftesten. Während starke Stimmung ausgedrückt wurde   um C '' richtig '' zu machen, indem man überall längere Namen verlangt,   Der Ausschuss erkannte an, dass die Sprache für die kommenden Jahre   koexistieren mit anderen Sprachen und mit älteren Assemblern und Linkern.   Anstatt die Unterstützung für den Standard zu untergraben, die schwere   Einschränkungen wurden beibehalten.

Compiler wie GCC können den vollständigen Bezeichner speichern.

  
  • Die Anzahl der signifikanten Anfangsbuchstaben in einer Kennung (C90 6.1.2, C90, C99 und C11 5.2.4.1, C99 und C11 6.4.2).

         

    Bei internen Namen sind alle Zeichen von Bedeutung. Für externe   Namen, die Anzahl der signifikanten Zeichen wird vom Linker definiert;   Für fast alle Ziele sind alle Zeichen von Bedeutung.

  •   
    
user3920237 02.11.2014 12:07
quelle
3

Eine konforme Implementierung muss mindestens 31 Zeichen für einen externen Bezeichner unterstützen (und Ihre Bezeichner sind intern, wobei der Grenzwert 63 für C99 und C11 ist).

Tatsächlich ist die Absicht des Standards, alle Zeichen signifikant zu machen, aber das Committee möchte keine Implementierungen nichtkonform machen, indem es es nicht bereitstellt. Die Grenzen für externe Identifikatoren gehen von einigen Linkern aus, die nicht mehr liefern können (in C89 waren nur 6 Zeichen erforderlich, weshalb die alten Standardbibliotheksfunktionen nicht länger als 6 Zeichen lang sind).

Um genau zu sein, der Standard schreibt diese Grenzen nicht genau vor, die Sprache im Standard ist ziemlich freizügig:

C11 (n1570) 5.2.4.1 Übersetzungsgrenzwerte

  

Die Implementierung muss in der Lage sein, mindestens ein Programm zu übersetzen und auszuführen, das mindestens eine Instanz jeder der folgenden Grenzen enthält: 18

     
  • [...]
  •   
  • 63 signifikante Anfangszeichen in einer internen Kennung oder einem Makronamen (jeder universelle Zeichenname oder jedes erweiterte Quellzeichen wird als einzelnes Zeichen betrachtet)
  •   
  • 31 signifikante Anfangszeichen in einer externen Kennung (jeder universelle Zeichenname, der eine Kurzkennung von 0000FFFF oder weniger angibt, wird als 6 Zeichen betrachtet, jeder universelle Zeichenname, der eine Kurzkennung von 00010000 oder mehr angibt, wird als 10 Zeichen und jede erweiterte Quelle betrachtet Zeichen wird als die gleiche Anzahl von Zeichen wie der entsprechende universelle Zeichen-Name, falls vorhanden, 19 betrachtet
  •   
  • [...]
  •   

Fußnote 18) drückt deutlich die Absicht aus:

  

Implementierungen sollten möglichst keine festen Übersetzungsgrenzen auferlegen.

Fußnote 19) bezieht sich auf zukünftige Sprachrichtungen 6.11.3:

  

Die Beschränkung der Bedeutung eines externen Namens auf weniger als 255 Zeichen (unter Berücksichtigung jedes universellen Zeichennamens oder erweiterten Quellzeichens als einzelnes Zeichen) ist eine veraltete Funktion, die eine Konzession an bestehende Implementierungen darstellt.

Und um die Freizügigkeit im ersten Satz von 5.2.4.1 zu erklären, vgl. die C99 Begründung (5.10)

  

5.2.4 Umgebungsgrenzwerte

     

Der C89-Ausschuss stimmte darin überein, dass der Standard etwas über bestimmte Kapazitäten und Einschränkungen sagen müsse, aber die Frage, wie diese Vertragspunkte durchgesetzt werden können, war Gegenstand einer beträchtlichen Debatte.

     

5.2.4.1 Übersetzungsbeschränkungen

     

Der Standard erfordert, dass eine Implementierung in der Lage ist, ein Programm zu übersetzen und auszuführen, das die angegebenen Grenzwerte erfüllt. Dieses Kriterium wurde als ein nützlicher Spielraum für den Implementierer beim Erreichen dieser Grenzen angesehen. Während eine mangelhafte Umsetzung wahrscheinlich ein Programm schaffen könnte, das diese Anforderung erfüllt, aber trotzdem nutzlos ist, meinte der C89-Ausschuss, dass ein solcher Einfallsreichtum wahrscheinlich mehr Arbeit erfordern würde, als etwas Nützliches zu machen. Der Sinn sowohl der C89- als auch der C99-Ausschüsse bestand darin, dass die Implementierer die Übersetzungsgrenzen nicht als Werte festverdrahteter Parameter interpretieren sollten, sondern eher als eine Reihe von Kriterien, anhand derer eine Implementierung beurteilt wird.

    
mafso 02.11.2014 12:17
quelle
2

Es gibt keine Begrenzung. Eigentlich gibt es ein Limit, es muss klein genug sein, dass es in den Speicher passt, aber ansonsten nicht. Wenn es ein eingebautes Limit gibt (ich glaube nicht, dass es da ist), ist es so riesig, dass Sie wirklich schwer genug wären, es zu erreichen. ich generierte C ++ - Code mit 2 Variablen mit einem unterschiedlichen letzten Zeichen, um sicherzustellen, dass die Namen, die long sind, unterschiedlich sind. Ich habe 64KB Datei und dachte, das ist genug.

    
Abinash Ghosh 02.11.2014 12:12
quelle