_Bool и bool: Как решить проблему библиотеки C, которая использует _Bool?

Я написал набор структур данных и функций на 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 , но это кажется непривлекательным.

Есть ли лучший / идиоматический / стандартный способ сделать это?

16
задан James Morris 20 August 2010 в 09:57
поделиться

3 ответа

Просто #include и использовать bool.

4
ответ дан 30 November 2019 в 22:43
поделиться

используйте typedef int _Bool как для кода C, так и для кода C ++. Я буду удивлен, если _Bool будет определен как что-нибудь еще.

-5
ответ дан 30 November 2019 в 22:43
поделиться

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

Обратите внимание: вы всегда можете протестировать макрос __ cplusplus в своем заголовке, чтобы определить, компилируется ли код как C ++, и установить соответствующие типы.

11
ответ дан 30 November 2019 в 22:43
поделиться