Ü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:

#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif

struct astruct
{
  bool myvar;
  /* and a bunch more */
}

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


Benutzeravatar von Luchian Grigore
Luchian Grigore

Weil bool ist ein Basistyp in C++ (aber nicht in C) und kann nicht neu definiert werden.

Sie können Ihren Code mit umgeben

#ifndef __cplusplus
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif

  • 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

Benutzeravatar von Richard J. Ross III
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.

    – IronMensan

    17. Mai 2012 um 13:10 Uhr

Sie sollten die verwenden __cplusplus Makro:

#ifndef __cplusplus
#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
#endif 

Schau dir das an Link zu den häufig gestellten Fragen zu C++ für weitere Details.

Benutzeravatar von Justin Hirsch
Justin Hirsch

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 !!

1443800cookie-checkÜberprüfen Sie, ob bool in gemischtem C/C++ definiert ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy