【发布时间】:2009-02-08 21:43:53
【问题描述】:
我正在用 C 编写的一些代码之上编写一个(我的第一个)C++ 类,但我只能通过在 extern 块中声明 C 函数来编译 C++。我的项目使用自动工具;有什么办法可以自动化这个过程,这样我就不必维护两个头文件了?
【问题讨论】:
我正在用 C 编写的一些代码之上编写一个(我的第一个)C++ 类,但我只能通过在 extern 块中声明 C 函数来编译 C++。我的项目使用自动工具;有什么办法可以自动化这个过程,这样我就不必维护两个头文件了?
【问题讨论】:
在 C 代码头文件的 #ifdef 内使用外部块
头文件的开始
#ifdef __cplusplus
extern "C" {
#endif
...在头文件的末尾
#ifdef __cplusplus
}
#endif
这样它就可以同时包含在 C 和 C++ 源代码中
【讨论】:
是的,创建包含你的 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;
}
【讨论】:
extern "C"。这样,您可以在 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。
【讨论】: