Использование библиотеки, написанной на C, с переполнением стека

Я пытаюсь включить веб-сервер 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

1

Решение

Если это ваша единственная проблема, то вы можете добавить #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 ++.

Но я сомневаюсь, что это будет вашей единственной проблемой, и в этом случае вы, вероятно, быстро поймете, что добавление функционального слоя интерфейса — самый безопасный путь.

0

Другие решения

C и C ++ — это разные языки, которые имеют общее подмножество. Вы можете скомпилировать большинство C декларации с компилятором C ++, помещая их в раздел, определяющий связь C, как вы показываете, но это следует из подъязыка объявлений C, который почти полностью находится в разделяемом подмножестве C и C ++.

Однако в C ++ больше декларативных функций и больше ограничений, чем в C. В частности, тот факт, что это обеспечивает bool поскольку встроенный тип накладывает ограничение на то, что этот идентификатор не может быть повторно объявлен как имя определения типа. C, с другой стороны, имеет стандартный заголовок, который определяет именно такой typedef, и люди не так уж и редко используют свои собственные. Такие typedefs будут отклонены компилятором C ++, несмотря на связь с C.

Если проект C еще не создан с целью обеспечения его использования программами C ++, и простого включения включения заголовка в блок связи C недостаточно, то вы просто не можете использовать заголовок этой библиотеки как есть. Вы можете либо изменить его, либо предоставить альтернативу. Возможно, вам даже потребуется предоставить несколько функций-оболочек, написанных на C, чтобы они служили интерфейсом для вашей программы на C ++. Детали зависят от библиотеки, которую вы пытаетесь использовать.

2

По вопросам рекламы [email protected]