Überprüfen Sie, ob bool in gemischtem C/C++ definiert ist
Lesezeit: 3 Minuten
Ich habe also Probleme mit einigem Code, den ich geerbt habe. Dieser Code wurde in einer reinen C-Umgebung gut erstellt, aber jetzt muss ich C++ verwenden, um diesen Code aufzurufen. Die Überschrift problem.h enthält:
Wenn ich es als C++-Code kompiliere, bekomme ich error C2632: 'char' followed by 'bool' is illegal
Ich bekomme den gleichen Fehler, wenn ich die umschließe #include "problem.h" In extern "C" { ... } (was ich nicht verstehe, weil es kein Schlüsselwort geben sollte bool beim Kompilieren als C?)
Ich habe versucht, den Block zu entfernen #ifndef _BOOL Zu #endifund als C++ kompilieren, und ich erhalte Fehler:
error C2061: C requires that a struct or union has at least one member error C2061: syntax error: identifier 'bool'
Ich verstehe einfach nicht, wie sich der C++-Compiler über eine Neudefinition von beschwert boolaber wenn ich die Neudefinition entferne und versuche, einfach zu verwenden bool Variablen zu definieren, findet es nichts.
Jede Hilfe wird sehr geschätzt.
Beachten Sie, dass extern "C" bedeutet nicht “als C kompilieren”. Es bedeutet “mit C-Verknüpfung kompilieren”. Der Code darin ist immer noch C++, Sie dürfen nur nichts definieren, was nicht als C gelinkt werden kann.
– Steve Jessop
17. Mai 2012 um 13:17 Uhr
Luchian Grigore
Weil bool ist ein Basistyp in C++ (aber nicht in C) und kann nicht neu definiert werden.
Aber dieser Code ist auch nicht mit C99 kompatibel stdbool.hin acht nehmen!
– Richard J.Ross III
17. Mai 2012 um 12:57 Uhr
Es wird immer noch darüber geklagt char followed by bool is illegaldas bedeutet also, dass es die nicht liest _cplusplus definieren?
– vorl
17. Mai 2012 um 13:00 Uhr
@prelic es sind zwei Unterstriche davor cplusplus.
– Richard J.Ross III
17. Mai 2012 um 13:01 Uhr
Richard J. Ross III
Sie können C99 verwenden bool:
#ifndef __cplusplus
#include <stdbool.h>
#endif
bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type.
Warum sollten Sie das verwenden?
Für die Kompatibilität mit anderem C99-Code. _Bool wird häufig in C99-Code verwendet und ist sehr nützlich. Es gibt Ihnen auch die Möglichkeit, einen booleschen Datentyp zu haben, ohne dass Sie eine Menge Dinge typisieren müssen, wie hinter den Kulissen, _Bool ist ein vom Compiler definierter Datentyp.
Nichts nimmt ein Bit in Erinnerung. Wollten Sie Bytes schreiben?
– Luchian Grigore
17. Mai 2012 um 12:59 Uhr
@LuchianGrigore nein, ich meinte bisschen. Sehen Sie sich Bitfelder an, wenn in einer Struktur Bools auf ähnliche Weise gepackt werden.
– Richard J.Ross III
17. Mai 2012 um 13:00 Uhr
Der Standard sagt nichts über die Größe aus, außer der Größe von char. Der Rest ist implementierungsdefiniert. Es kann standardkonforme Compiler geben, die 1 MB zum Speichern eines Bool verwenden.
– Luchian Grigore
17. Mai 2012 um 13:02 Uhr
Aber trotzdem der erste Teil Ihrer Antwort – den Sie verwenden sollten stdbool.h anstatt einen eigenen bool zu definieren – ist richtig.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
17. Mai 2012 um 13:06 Uhr
@Richard wenn Strukturen gepackt sind bools in einzelne Bits, wie funktioniert &someStruct.someBoolMember arbeiten? Sagst du das sizeof(bool *) > sizeof(int *)? Und das sizeof(bool) gibt irgendwie 1/8 in a zurück size_t. Anders als die vector<bool> Spezialisierung und Bitfelder, bools dauern immer mindestens ein Byte.
Ich hatte dieses Problem “‘char’ gefolgt von ‘bool’ ist illegal” auch in VS. Das Problem für mich war, dass ich meine Klassendeklaration nicht mit einem Semikolon beendet habe – was ich nicht erwartet hatte, da dies in der Header-Datei war und das Problem in der cpp-Datei auftauchte! z.B:
class myClass
{
}; // <-- put the semi colon !!
14438000cookie-checkÜberprüfen Sie, ob bool in gemischtem C/C++ definiert istyes
Beachten Sie, dass
extern "C"
bedeutet nicht “als C kompilieren”. Es bedeutet “mit C-Verknüpfung kompilieren”. Der Code darin ist immer noch C++, Sie dürfen nur nichts definieren, was nicht als C gelinkt werden kann.– Steve Jessop
17. Mai 2012 um 13:17 Uhr