Fehler in c, aber nicht in C ++

8
%Vor%

Wenn ich das kompiliere gibt das Fehler in C aber nicht in C ++ !! Kann mir bitte jemand den Grund erklären?

Hinweis: Ich weiß, dass const standardmäßig auf interne Verknüpfungen in 'C ++' verweist, wobei, wie in 'C', standardmäßig auf externe Verknüpfungen zurückgegriffen wird. Hat es irgendeine Beziehung zu dem obigen Fall?

    
esh 17.06.2010, 11:48
quelle

6 Antworten

4

Wie andere erklärt haben, wird C einfacher gehalten als C ++ und erlaubt es nicht, const-Variablen in ganzzahligen Konstanten auszudrücken. Aber sowohl in C89 als auch in C ++ deklarierte Arrays müssen konstante Größen für die Kompilierung haben.

Sie können dafür Aufzählungen verwenden

%Vor%

Es hat nicht mit interner Verknüpfung zu tun - externe Verknüpfungsvariablen sind in C ++ in konstanten Integerkonstanten gleichwertig. Die interne Verknüpfung in C ++ ist eher eine Konsequenz, aber keine Notwendigkeit, sie in konstanten Ausdrücken erscheinen zu lassen. Der C ++ Standard erklärt, warum sie standardmäßig eine interne Verknüpfung haben

  

Da const-Objekte in C ++ als Werte für die Kompilierung verwendet werden können, fordert diese Funktion Programmierer dazu auf, explizite Initialisierungswerte für jedes const anzugeben. Mit dieser Funktion kann der Benutzer const-Objekte in Header-Dateien einfügen, die in vielen Kompilierungseinheiten enthalten sind

    
Johannes Schaub - litb 17.06.2010, 12:13
quelle
9

Dies ist in C89 C nicht gültig, obwohl es in C99 gültig sein kann

Siehe diese Stapelüberlauffrage

    
David Sykes 17.06.2010 11:55
quelle
4

Ich denke, das liegt daran, dass der Compiler t+5 nicht auf einen konstanten Ausdruck auswerten kann. Es sieht so aus, als sollte es in Ordnung sein, aber:

  

Ein wichtiger Punkt bei Array-Deklarationen ist, dass sie die Verwendung unterschiedlicher Indizes nicht erlauben. Die angegebenen Zahlen müssen konstante Ausdrücke sein, die zur Kompilierzeit, nicht zur Laufzeit ausgewertet werden können.

Quelle

    
ChrisF 17.06.2010 11:55
quelle
3

In C muss die Größe eines Arrays ein konstanter Ausdruck sein. Const Int ist in C kein konstanter Ausdruck. Seine Bedeutung ist eher "readonly". Verwenden Sie stattdessen #define t 5.

    
nuriaion 17.06.2010 11:57
quelle
1

Ja, das hängt mit der externen Verknüpfung von t von C zusammen.

Sie haben eine extern verknüpfte Ganzzahl t deklariert. Wenn Sie diese Datei mit einer anderen verknüpfen, die t definiert, müsste die Größe Ihres Puffers nach der Kompilierungszeit der Datei bestimmt werden, was in C natürlich nicht möglich ist.

    
Jordan Lewis 17.06.2010 11:55
quelle
1

Sie haben hier zwei Probleme, dynamisch große Arrays und Konflikte. Das Konzept von const unterscheidet sich in C und C ++. Für C ist es nur eine Variable, die Sie nicht ändern dürfen, und ist daher keine gültige Dimension für C-Dialekte, die nur Arrays mit festen Kompilierungszeiten zulassen. Die einzige Möglichkeit, eine 'Kompilierzeitkonstante' in C zu definieren, ist die Verwendung eines Aufzählungstyps

%Vor%

So etwas würde mit C89 funktionieren.

Im Gegensatz dazu sollte der Code auch in C99 funktionieren. Dort würde das Array syntaktisch als dynamisch identifiziert werden. Dann sollte jeder anständige Optimierer in der Lage sein, dies zu optimieren. Aber hütet euch auch davor %Code% wäre die Gesamtgröße des Arrays (10) in C ++, während es mit c99 sizeof(buf)

wäre     
Jens Gustedt 17.06.2010 12:24
quelle

Tags und Links