_Bool и bool: Как решить проблему библиотеки C, которая использует _Bool? - программирование
Подтвердить что ты не робот

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

Я написал набор структур данных и функций в C, некоторые из которых используют тип данных _Bool. Когда я начал, проект должен был быть чистым C. Теперь я изучаю, используя набор инструментов GUI на основе С++, и сделал внутренний код в библиотеке.

Однако при компиляции С++ GUI компилятор испускает следующую ошибку:

ISO C++ forbids declaration of '_Bool' with no type

Сначала мне казалось, что я могу найти и заменить _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) типом данных и связывание с библиотекой с использованием другого (С++ bool). Практически это может быть неважно, но теоретически это возможно (может быть, какая-то неясная система где-то, что делает так, что вселенная вывернется наизнанку).

Я полагаю, что я мог бы просто использовать int и использовать 0 для false и 1 для true, и typedef с чем-то вроде typedef int mybool, но кажется непривлекательным.

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

4b9b3361

Ответ 1

Dumbass! Просто #include <stdbool.h> и используйте bool.

Ответ 2

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

Примечание. Вы всегда можете проверить макрос __cplusplus в своем заголовке, чтобы определить, компилируется ли код как С++ и соответствующим образом задавать типы.

Ответ 3

Формально нет решения этой проблемы. Тип _Bool существует только в C. Язык С++ не предоставляет никакого типа, который бы гарантировал двоичную совместимость с _Bool. С++ bool не гарантируется совместимость.

Правильное решение - не использовать bool или _Bool в объявлениях параметров функций C, предназначенных для непосредственного доступа (то есть привязки) к коду С++. Используйте int, char или любой другой тип, который гарантированно совместим.

Ответ 4

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

Тип данных _Bool на C99 существует, чтобы избежать конфликтов с возможными существующими версиями bool, которые программисты могли быть определены до стандартного C99. Таким образом, программист может выбрать лучший способ адаптации своих старых программ на C к миграции в новый стандарт. Таким образом, я считаю, что использовать слово bool является поистине желанием комьюнитизма C99, но он был вынужден окружать проблемы несовместимости, определяя уродливое слово _Bool. Это показывает, что программисту, вероятно, придется использовать "намеченное" слово bool в своих проектах. Это наиболее логичное слово для объявления булевого типа в программе.

В некоторых случаях было бы хорошей идеей сохранить программирующее предвзятое определение bool, а в других случаях было бы лучше использовать версию bool, определенную в <stdbool.h>. Программист должен решить, что лучше в каждом случае, и, кроме того, возможно, подумать о том, является ли постепенная миграция на <stdbool.h> хорошим действием.

Если вы начинаете проект с нуля, то, вероятно, лучшим подходом всегда будет использовать bool, определенный в <stdbool.h>.

Ответ 5

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