乐闻世界logo
搜索文章和话题

Is it required to add 'extern C' in source file also?

5 个月前提问
4 个月前修改
浏览次数29

1个答案

1

在涉及C++和C之间的互操作性时,使用extern "C"是一个常见的做法。这主要是因为C++支持函数重载,而C不支持。因此,当你希望在C++代码中调用C函数,或者在C代码中调用C++函数时,就需要用到extern "C"来告知编译器按照C的链接方式来处理相关的函数。

具体情况分析:

  1. 在C++源文件中调用C函数:
    如果你在C++文件中调用C写的库或者函数,你需要在C++源文件中对这些C函数使用extern "C"。这样做是为了确保C++编译器不会因为名字修饰(name mangling)而找不到C语言编写的函数。

    例子:

    cpp
    // 假设C库里有这样一个函数 // void c_function(int); // 在C++源文件中,你应该这样声明 extern "C" { #include "c_library.h" } // 现在你可以正常调用c_function,而无需担心链接错误 int main() { c_function(10); return 0; }
  2. 在C源文件中或者库中使用C++函数:
    如果你想在C源文件中调用由C++编写的函数,你需要在C++的声明部分添加extern "C"。这样做是为了确保在C++代码中的函数可以被C编译器正确链接。

    例子:

    cpp
    // C++库或源文件 extern "C" void cpp_function() { // C++功能代码 } // 相应的C文件只需要声明函数原型 // void cpp_function(); // 然后就可以调用cpp_function()了
  3. 包含头文件:
    当你的项目中同时包含C和C++代码时,通常是把extern "C"放在C++的头文件中,而不是源文件。这样一来,每当这个头文件被包含在C++文件中时,它告诉编译器这部分代码应当以C的链接方式来处理。

    例子:

    cpp
    // c_functions.h #ifdef __cplusplus extern "C" { #endif void c_function(int); #ifdef __cplusplus } #endif

结论

综上所述,是否在源文件中添加extern "C"取决于你的具体需求。如果你正在处理一个既包含C也包含C++代码的项目,并且需要在C++中调用C代码或反之,则你需要在适当的位置添加extern "C"。通常来说,将extern "C"放在头文件中是最佳实践,因为它可以保证链接方式的一致性,同时减少重复代码。

2024年6月29日 12:07 回复

你的答案