Я написал набор структур данных и функций на C, некоторые из которых используют тип данных _Bool . Когда я начинал, проект должен был быть на чистом C. Теперь я исследую, используя набор инструментов графического интерфейса на основе C ++, и преобразовал внутренний код в библиотеку.
Однако при компиляции графического интерфейса C ++ компилятор выдает следующую ошибку:
ISO C ++ запрещает объявление _Bool без типа
Сначала я думал, что могу найти и заменить _Bool
в bool
и создайте:
/* mybool.h */
#ifndef MYBOOL_H
#define MYBOOL_H
typedef _Bool bool;
#endif /* MYBOOL_H */
, а затем в любых заголовках, использующих _Bool
#ifdef __cplusplus
extern "C" {
#else
#include "mybool.h"
#endif
/* rest of header... */
, пока я не понял, что это будет компиляция библиотеки с одним логическим типом данных (C _Bool) и связывание с библиотекой используя другой (C ++ bool). На практике это может не иметь значения, но теоретически, вероятно, имеет значение (где-то может быть какая-то неясная система, которая, делая это, заставляет Вселенную выворачиваться наизнанку).
Полагаю, я мог бы просто использовать int и использовать 0 для false и 1 для true, а затем определить его с помощью чего-то вроде typedef int mybool
, но это кажется непривлекательным.
Есть ли лучший / идиоматический / стандартный способ сделать это?
используйте typedef int _Bool
как для кода C, так и для кода C ++. Я буду удивлен, если _Bool будет определен как что-нибудь еще.
Если используемые вами компиляторы C и C ++ принадлежат одному поставщику, то можно ожидать, что C _Bool
будет того же типа, что и C ++ bool
, включая ]
сделал бы все хорошо совместимым. Если они от разных поставщиков, вам необходимо проверить совместимость.
Обратите внимание: вы всегда можете протестировать макрос __ cplusplus
в своем заголовке, чтобы определить, компилируется ли код как C ++, и установить соответствующие типы.