Hallo Ich habe den folgenden Testcode und ich bin verwirrt über cpp.
Wenn Sie in library.h ein Array mit einer leeren Element-Klausel deklarieren .. Was wird der Compiler wählen? Es beschwert sich auch nicht, ich benutze Cygwin.
In library.cpp gebe ich zwei Elementen Werte zu, nimmt der Compiler ein Array mit einem Element an und schreibe ich das zweite Element außerhalb des Bereichs des Arrays?
Dieser Code ist in C ++ einfach illegal. Array-Größe in C ++ muss positive Kompilierzeitkonstante sein. Lösung ist es, es zu ersetzen:
%Vor%Beachten Sie, dass die Deklaration
%Vor% ist in c99 gültig und wird als Unvollständiger Array-Typ bezeichnet. Der C-Standard garantiert, dass a
mindestens ein Element vom Typ char
speichern kann. Dies ist in C ++ nicht gültig. Der C ++ - Standard erlaubt diese nicht. Einfach weil beide verschiedene Sprachen sind.
Erstens ist es kein legales C ++. Es ist ein alter Hack, den C nur gemacht hat
legal in C98. Die Grundidee ist, dass solche struct
nur sein können
dynamisch zugeordnet (mit malloc
), und Sie jedoch zuweisen
Für das Objekt danach wird viel Speicher benötigt. Also wirst du es tun
etwas wie malloc( sizeof( library ) + strlen( s ) + 1 )
.
Der Hack wird verwendet, um eine zusätzliche Zuweisung zu vermeiden.
Eine Klasse, die diesen Hack verwendet kann nicht mit new
, nor
kann es ein Mitglied oder eine Basisklasse sein. (Es kann kein Mitglied sein in
C, entweder.)
Sie können dies in C ++ nachbilden:
%Vor% Beachten Sie jedoch, dass dies im Gegensatz zur C-Lösung das Risiko von
Ausrichtungsprobleme. Es funktioniert gut für Zeichentypen und es
funktioniert, wenn andere Mitglieder der Klasse mindestens so viel benötigen
Ausrichtung als Puffer-Typ, aber es kann sonst fehlschlagen. (Das
Die Implementierung von std :: basic_string in g ++ verwendet it-and
wird auf einigen Computern abstürzen, wenn sie mit double
instanziiert werden.)
Das leere Array deklariert ein Array der Länge Null. Es wird in C verwendet, indem eine Struktur S in einer Speicherzone platziert wird, die größer als sizeof (S) ist, und dann mit dem Array auf den verbleibenden Speicher zugegriffen wird:
%Vor%Dies ist ein Trick, der in C ++ viel weniger nützlich ist. Verwenden Sie stattdessen einfach std :: vector.
Es wird allgemein als struct hack in C bezeichnet. Es verwendet ein Feature namens flexibles Array-Element .
Dies ist jedoch nicht Teil einer C ++ - Standardspezifikation. Sehen Sie sich diese Frage an.
Beachten Sie, dass die Beobachtung, dass etwas scheinbar funktioniert, nicht bedeutet, dass Sie sich darauf verlassen können, dass es zuverlässig funktioniert. Wenn das Verhalten nicht definiert ist, kann technisch alles passieren. Einschließlich Raubvögel, die plötzlich angreifen.
In C ++ würden Sie wahrscheinlich stattdessen ein std::vector<char>
oder ein std::string
verwenden.
Tags und Links c++