Welcher Unterschied zwischen C und C ++ verbietet es, dass dieses eklektische Codebeispiel in letzterem kompiliert wird?

7

Ich wanderte gerade über den Artikel Hallo Welt in C ohne Semikolon und ohne IF / WHILE / FOR-Statements

Der folgende Code funktionierte in C, aber nicht in C ++:

%Vor%

In C ++ bekomme ich diesen Fehler:

%Vor%

Warum funktioniert es nicht in C ++?

    
CppLearner 04.01.2012, 18:49
quelle

3 Antworten

17

, weil C ++ keine Variable Length Array-Funktion hat.

Der Parameter argv in

char *argv[printf("Hello, world!\n")]

ist ein Array variabler Länge.

Der Ausdruck, der die Größe des Arrays angibt, ist

%Vor%

Das Ergebnis dieses Ausdrucks hat den Typ int und ist die Anzahl der übertragenen Zeichen (oder ein negativer Wert bei einem Fehler);

Ein Array, bei dem der Ausdruck in [] nicht konstant ist, wie im Beispiel der Ausdruck printf , ist ein Array variabler Länge. Diese Arrays dürfen auch als Typ eines Funktionsparameters verwendet werden.

Array variabler Länge ist ein Feature, das in C99 in C eingeführt wurde und nicht in C ++ eingeführt wurde.

    
ouah 04.01.2012, 18:52
quelle
7

Wie die Fehlermeldung anzeigt, erwartet main char** für das zweite Argument. Aufgrund von Array-Zerfallsregeln sind die folgenden beiden jedoch OK:

%Vor%

Und tatsächlich ist das Folgende auch äquivalent, weil Array-Zerfall sich nicht um Dimensionen kümmert:

%Vor%

Während in C99-Arrays variable Länge haben kann, ist dies nicht der Fall in C ++ . Also verwenden Sie einen nicht konstanten Ausdruck für diese Array-Dimension - in Ihrem Fall printf("Hello world\n") - ist eine ungültige Syntax.

%Vor%

Diese ungültige Syntax verwirrt den Parser und verursacht diesen irreführenden Fehler in Ihrem Compiler.

Wenn Sie den Code leicht vereinfachen, um den Funktionsaufruf-Ausdruck zu entfernen (aber immer noch einen nicht-konstanten Wert für Array-Begrenzungen verwenden), dann erhalten Sie weit relevantere Fehlermeldung :

%Vor%

GCC 4.1.2 gibt diese nützliche Nachricht auch für Ihren ursprünglichen Code , , damit Ihr Compiler wirklich alt ... entweder das oder dein Testfall ist gebrochen trotz der weit neuen GCC 4.5.1, die die Nachricht ergeben du hast gepostet .

    
quelle
3

In% ist char *argv[some_expression] ein Array variabler Länge, und wenn es als Funktion verwendet wird, wird das Argument so interpretiert, dass es einen Zeiger bedeutet (genau wie ein Array mit fester Länge oder unbekannter Länge, wenn ein Funktionsargument deklariert wird).

In C ++ existieren Arrays variabler Länge nicht, daher ist es nicht gültig. char * argv[some_constant] und char * argv[] , beide sind gültig und entsprechen char ** argv - aber natürlich kann keine von diesen Nebenwirkungen haben und kann daher nicht verwendet werden, um diese alberne Übung zu lösen.

    
Mike Seymour 04.01.2012 18:55
quelle

Tags und Links