Использование кода C из C ++ с использованием автоинструментов - PullRequest
5 голосов
/ 09 февраля 2009

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

Ответы [ 4 ]

15 голосов
/ 09 февраля 2009

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

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

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

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

3 голосов
/ 09 февраля 2009

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

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

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

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

#include "croutine.h"

extern _crtn void MyFunction( ... );

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

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

1 голос
/ 09 февраля 2009

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

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

#ifdef __cplusplus
}
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...