У меня есть 10-летняя библиотека C, которая, я считаю, использовалась для прекрасных работ в старые добрые времена, но когда я попытался использовать ее с источником С++ (содержащим основную функцию) на днях Я столкнулся с некоторыми трудностями.
Изменить: для пояснения, библиотека C компилируется только с помощью gcc
, и она генерирует объектный файл old_c_library.o
. Предполагалось, что эта библиотека будет использоваться таким образом, чтобы заголовочный файл C old_c_library.h
был #include
d в исходном файле main.c
C. Затем ваш основной исходный файл C должен быть скомпилирован и связан с old_c_library.o
через gcc
. Здесь я хочу вместо этого использовать исходный файл С++ main.cpp
и компилировать/связывать его с g++
.
При компиляции исходного файла С++ возникли следующие три проблемы:
- один из файлов заголовков библиотеки C содержит зарезервированное слово С++
new
(это имя целого), что привело к фатальной ошибке; и - один из файлов заголовков библиотеки C содержит вызов
calloc
(явно не указан тип), что привело к фатальной ошибке; и - В различных файлах библиотеки C содержится код, в котором происходит сравнение целых чисел с подписью и без знака, что привело к предупреждениям.
Изменить: я попытался использовать трюк #extern "C" { #include "obsolete_c_library.h" }
, как это было предложено в комментариях, но это не решило ни одной из моих проблем.
Я могу разобраться в проблеме 1, переименовав все экземпляры зарезервированных слов и заменив их - в основном - что угодно. Я могу решить проблему 2, указав вызов calloc
. Я могу попытаться разобраться с предупреждениями, предложенными здесь: Как отключить предупреждения GCC для нескольких строк кода.
Но я все еще удивляюсь, есть ли способ преодолеть эти трудности элегантным, высокоуровневым способом, без, фактически касающимся исходной библиотеки?
Соответствующие: Где C не подмножество С++? и Я делаю результат malloc? и Как использовать extern для обмена переменными между исходными файлами?.