使用 g++ 时,使用 extern "C" { 对C++代码的影响
Impact of using extern "C" { on C++ code when using g++
当使用G ++(例如Linux上的4.5版本)时,任何人都可以解释如果用户为混合C/C++系统编写头文件会发生什么,如下所示:
#ifdef __cplusplus
extern "C" {
int myCPPfunc(some_arg_list....); /* a C++ function */
}
#endif
但这里myCPPfunc()
是一个普通的C++函数,里面有一个类 def - 即它被错误地标记为 C 函数。
这有什么影响?
这样做的主要影响是你不能重载它,例如,这是合法的:
int myCPPfunc(int a);
int myCPPfunc(char a);
但这不是:
extern "C"
{
int myCPPfunc(int a);
int myCPPfunc(char a);
}
让extern "C"
函数的实现使用任意C++功能是完全合法的。 你不能做的是让它的接口成为你在 C 语言中无法做到的事情,例如参数重载、方法(虚拟或其他)、模板等。
请注意,许多"在 C 中无法执行的操作"情况会引发未定义的行为,而不是提示编译错误。
这告诉C++编译器在头文件中声明的函数是 C 函数。
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.2
这正是
extern "C"
的用途 - 它允许您编写可以从 C 调用的 C++ 函数。
从本质上讲,该声明告诉C++编译器您希望C++函数myCPPfunc()
具有可从 C 链接(因此可调用)的外部接口。
该函数的实现仍然C++,仍然可以使用C++功能。
通常,头文件中函数的声明可能更像:
#ifdef __cplusplus
extern "C" {
#endif
int myCPPfunc(some_arg_list....); /* a C++ function */
#ifdef __cplusplus
}
#endif
这允许C++编译器或 C 编译器使用相同的头文件,并且每个编译器都会将其视为声明 C 可调用函数。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- 使用指针从C++中的数组中获取最大值
- 使用不带参数的函数访问结构元素