Я пытаюсь включить веб-сервер mongoose, который написан на C, и написать остальную часть кода на C ++.
При компиляции я получаю сообщение об ошибке: переопределение встроенного типа C ++ ‘bool’ в заголовочном файле mongoose в Code Blocks
#include <iostream>
#include "mongoose.h"
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
Я вложил заголовок мангусты в
#ifdef __cplusplus
extern "C"{
#endif
// header content
#ifdef __cplusplus
}
#endif
и я все еще получаю ту же ошибку, в #include winsock2.h
Если это ваша единственная проблема, то вы можете добавить #define bool C_INT_BOOL
рядом с вашим extern "C"
, затем #undef bool
недалеко от }
В вашем файле cpp я бы написал:
extern "C"{
#define bool C_INT_BOOL
#include "mongoose.h"#undef bool
}
Это позволяет интерфейсу «C» видеть тип параметра int, но не должен мешать использованию bool в c ++.
Но я сомневаюсь, что это будет вашей единственной проблемой, и в этом случае вы, вероятно, быстро поймете, что добавление функционального слоя интерфейса — самый безопасный путь.
C и C ++ — это разные языки, которые имеют общее подмножество. Вы можете скомпилировать большинство C декларации с компилятором C ++, помещая их в раздел, определяющий связь C, как вы показываете, но это следует из подъязыка объявлений C, который почти полностью находится в разделяемом подмножестве C и C ++.
Однако в C ++ больше декларативных функций и больше ограничений, чем в C. В частности, тот факт, что это обеспечивает bool
поскольку встроенный тип накладывает ограничение на то, что этот идентификатор не может быть повторно объявлен как имя определения типа. C, с другой стороны, имеет стандартный заголовок, который определяет именно такой typedef, и люди не так уж и редко используют свои собственные. Такие typedefs будут отклонены компилятором C ++, несмотря на связь с C.
Если проект C еще не создан с целью обеспечения его использования программами C ++, и простого включения включения заголовка в блок связи C недостаточно, то вы просто не можете использовать заголовок этой библиотеки как есть. Вы можете либо изменить его, либо предоставить альтернативу. Возможно, вам даже потребуется предоставить несколько функций-оболочек, написанных на C, чтобы они служили интерфейсом для вашей программы на C ++. Детали зависят от библиотеки, которую вы пытаетесь использовать.