Я пишу (мой первый) класс C++ поверх некоторого кода, написанного на C, но я могу получить только C++, объявив функции C во внешнем блоке. Мой проект использует autotools; есть ли способ автоматизировать этот процесс, поэтому мне не нужно поддерживать два файла заголовков?Использование C-кода из C++ с использованием autotools
ответ
Да создавать файлы заголовков оболочки, которые включают в себя файлы заголовков C, как так ...
//Wrapper.h
#ifdef __cplusplus
extern "C"
{
#include "Actual.h"
}
#else
#include "Actual.h"
#endif
//Use.cpp
#include "Wrapper.h"
int main()
{
return 0;
}
//Use.c
#include "Wrapper.h"
/*or #include "Actual.h" */
int main()
{
return 0;
}
Используйте Экстерн блок внутри #ifdef в кодах C заголовочные файлы
Начало заголовочных файлов
#ifdef __cplusplus
extern "C" {
#endif
... и в конце заголовочных файлов
#ifdef __cplusplus
}
#endif
Таким образом, он будет работать для включения в источники C и C++
Используйте препроцессор C. Сделайте что-то вроде этого:
#ifdef __cplusplus
extern "C" {
#endif
// code goes here
#ifdef __cplusplus
}
#endif
У нас есть макрос в файле заголовка:
#ifdef __cplusplus
#define _crtn "C"
#else
#define _crtn
#endif
Затем в заголовочных файлах, мы можем использовать _crtn
:
#include "croutine.h"
extern _crtn void MyFunction(...);
Единственный Гоча является убедитесь, что вы включили заголовочный файл, содержащий прототип MyFunction внутри файла, содержащего реализацию MyFunction, чтобы он был скомпилирован с помощью ссылки «C».
Это то же самое, что и ответ @ epatel, но требует только уродливого #ifdef
в одном файле заголовка.
Малоизвестный факт: вы можете объявлять функции как extern «C++», хотя это отчасти бессмысленно, поскольку он является стандартным при компиляции с C++, а компиляторы C не могут скомпилировать C++. Но это может быть полезно в будущем для гипотетического языка C++++. –
Спасибо! Очень признателен. – drkatz
Хотя это, безусловно, работает, я думаю, что гораздо более высокий рейтинг ниже - лучше использовать препроцессор в фактических заголовочных файлах для объявления функций 'extern 'C". Таким образом, вы можете включить заголовок таким же образом в C и C++, и не нужно беспокоиться о дополнительном заголовке «обертка». –
Правда, но что, если фактический заголовок не может быть изменен? Что делать, если он был получен от стороннего/другого проекта, источники которого не поддерживаются вами? –