2009-02-08 6 views
5

Я пишу (мой первый) класс C++ поверх некоторого кода, написанного на C, но я могу получить только C++, объявив функции C во внешнем блоке. Мой проект использует autotools; есть ли способ автоматизировать этот процесс, поэтому мне не нужно поддерживать два файла заголовков?Использование C-кода из C++ с использованием autotools

ответ

3

Да создавать файлы заголовков оболочки, которые включают в себя файлы заголовков 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; 
} 
+0

Спасибо! Очень признателен. – drkatz

+0

Хотя это, безусловно, работает, я думаю, что гораздо более высокий рейтинг ниже - лучше использовать препроцессор в фактических заголовочных файлах для объявления функций 'extern 'C". Таким образом, вы можете включить заголовок таким же образом в C и C++, и не нужно беспокоиться о дополнительном заголовке «обертка». –

+0

Правда, но что, если фактический заголовок не может быть изменен? Что делать, если он был получен от стороннего/другого проекта, источники которого не поддерживаются вами? –

15

Используйте Экстерн блок внутри #ifdef в кодах C заголовочные файлы

Начало заголовочных файлов

#ifdef __cplusplus 
extern "C" { 
#endif 

... и в конце заголовочных файлов

#ifdef __cplusplus 
} 
#endif 

Таким образом, он будет работать для включения в источники C и C++

1

Используйте препроцессор C. Сделайте что-то вроде этого:

#ifdef __cplusplus 
extern "C" { 
#endif 
// code goes here 

#ifdef __cplusplus 
} 
#endif 
1

У нас есть макрос в файле заголовка:

#ifdef __cplusplus 
    #define _crtn "C" 
#else 
    #define _crtn 
#endif 

Затем в заголовочных файлах, мы можем использовать _crtn:

#include "croutine.h" 

extern _crtn void MyFunction(...); 

Единственный Гоча является убедитесь, что вы включили заголовочный файл, содержащий прототип MyFunction внутри файла, содержащего реализацию MyFunction, чтобы он был скомпилирован с помощью ссылки «C».

Это то же самое, что и ответ @ epatel, но требует только уродливого #ifdef в одном файле заголовка.

+0

Малоизвестный факт: вы можете объявлять функции как extern «C++», хотя это отчасти бессмысленно, поскольку он является стандартным при компиляции с C++, а компиляторы C не могут скомпилировать C++. Но это может быть полезно в будущем для гипотетического языка C++++. –