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?
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
Dies ist in C89 C nicht gültig, obwohl es in C99 gültig sein kann
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.
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.
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.
sizeof(buf)
Tags und Links c c++ compiler-errors