Вопрос по c, c++ – Проверьте, определен ли bool в смешанном C / C ++

11

Поэтому у меня возникли проблемы с некоторым кодом, который я унаследовал. Этот код прекрасно создавался в среде C-only, но теперь мне нужно использовать C ++ для вызова этого кода. Заголовокproblem.h содержит:

#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 */
}

Когда я компилирую его как код C ++, я получаюerror C2632: 'char' followed by 'bool' is illegal

Я получаю ту же ошибку, если обернуть#include "problem.h" вextern "C" { ... } (что я не понимаю, потому что не должно быть ключевого словаbool при компиляции как C?)

Я пытался удалить блок из#ifndef _BOOL в#endifи компиляция как C ++, и я получаю ошибки:

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

Я просто не понимаю, как компилятор C ++ жалуется на переопределениеboolТем не менее, когда я удаляю переопределение и пытаюсь просто использоватьbool чтобы определить переменные, он ничего не находит.

Любая помощь очень ценится.

Обратите внимание, чтоextern "C" "не означает" компилировать как C ". Это означает «компилировать с помощью C linkage». Код внутри по-прежнему на C ++, вам просто не разрешено определять все, что не может быть связано как C. Steve Jessop

Ваш Ответ

4   ответа
4

bool:

#ifndef __cplusplus
#include <stdbool.h>
#endif

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type.

Почему вы должны использовать это?

Для совместимости с другим кодом C99._Bool обычно используется в коде C99 и очень полезен. Это также дает вам возможность иметь логический тип данных без необходимости набирать много вещей, как за кулисами,_Bool тип данных, определенный компилятором

@ LuchianGrigore Нет, я имел в виду немного. Посмотрите на битовые поля, когда в структуре, bools упакованы аналогичным образом.
@Richard, если структура упакованаboolв отдельные биты, как это&someStruct.someBoolMember Работа? Вы говорите, чтоsizeof(bool *) > sizeof(int *)? И этоsizeof(bool) каким-то образом возвращает 1/8 вsize_t, Кромеvector<bool> специализация и битовые поля,bools всегда занимает по крайней мере один байт.
Ничто не занимает один бит в памяти. Вы хотели написать байт?
_Bool обычно принимает 1 бит значения и 31 бит заполнения ...
Error: User Rate Limit Exceeded
18

Так какbool является базовым типом в C ++ (но не в C) и не может быть переопределен.

Вы можете окружить свой код

#ifndef __cplusplus
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
Но этот код также несовместим с C99stdbool.hОстерегайтесь!
@ prelic это два подчеркивания передcplusplus.
Он все еще жалуетсяchar followed by bool is illegal, так что это означает, что он не читает_cplusplus определить? prelic
Ах, вот и все. Отлично, спасибо большое. prelic
Блин, ты меня обыграл :)
1

__cplusplus макрос:

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

Проверьте этоссылка на C ++ FAQ для дальнейших деталей.

-3

незаконно & quot; проблема в VS также. Проблема для меня заключалась в том, что я не заканчивал свое объявление класса точкой с запятой, чего я и не ожидал, поскольку это было в заголовочном файле, а проблема возникала в файле cpp! например:

class myClass
{

}; // <-- put the semi colon !!
Error: User Rate Limit ExceededboolError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы