Ответ 1
Dumbass! Просто #include <stdbool.h>
и используйте 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
, но кажется непривлекательным.
Есть ли лучший/идиоматический/стандартный способ сделать это?
Dumbass! Просто #include <stdbool.h>
и используйте bool
.
Если используемые вами компиляторы C и С++ принадлежат одному и тому же поставщику, я бы ожидал, что C _Bool
будет тем же типом, что и С++ bool
, и что включение <stdbool.h>
сделает все хорошо совместимым. Если они принадлежат другим производителям, вам необходимо проверить совместимость.
Примечание. Вы всегда можете проверить макрос __cplusplus
в своем заголовке, чтобы определить, компилируется ли код как С++ и соответствующим образом задавать типы.
Формально нет решения этой проблемы. Тип _Bool
существует только в C. Язык С++ не предоставляет никакого типа, который бы гарантировал двоичную совместимость с _Bool
. С++ bool
не гарантируется совместимость.
Правильное решение - не использовать bool
или _Bool
в объявлениях параметров функций C, предназначенных для непосредственного доступа (то есть привязки) к коду С++. Используйте int
, char
или любой другой тип, который гарантированно совместим.
Я думаю, что нужно использовать bool
в любом проекте, чтобы иметь совместимость с С++, если это необходимо.
Тип данных _Bool
на C99 существует, чтобы избежать конфликтов с возможными существующими версиями bool
, которые программисты могли быть определены до стандартного C99.
Таким образом, программист может выбрать лучший способ адаптации своих старых программ на C к миграции в новый стандарт.
Таким образом, я считаю, что использовать слово bool
является поистине желанием комьюнитизма C99, но он был вынужден окружать проблемы несовместимости, определяя уродливое слово _Bool
.
Это показывает, что программисту, вероятно, придется использовать "намеченное" слово bool
в своих проектах. Это наиболее логичное слово для объявления булевого типа в программе.
В некоторых случаях было бы хорошей идеей сохранить программирующее предвзятое определение bool
, а в других случаях было бы лучше использовать версию bool
, определенную в <stdbool.h>
.
Программист должен решить, что лучше в каждом случае, и, кроме того, возможно, подумать о том, является ли постепенная миграция на <stdbool.h>
хорошим действием.
Если вы начинаете проект с нуля, то, вероятно, лучшим подходом всегда будет использовать bool
, определенный в <stdbool.h>
.
используйте typedef int _Bool
для кода C и С++. Я буду удивлен, если _Bool определяется как что-либо еще.