在C ++中何时使用extern“C”?

25

可能是重复问题:
为什么在C++中需要使用extern"C"{ #include <foo.h> }?

我经常看到编写程序的方式如下:

extern "C" bool doSomeWork() {
  //
  return true;
}

为什么要使用extern "C"块?我们能否在C++中用其他东西替代它?使用extern "C"有什么好处吗?

我看到了一个解释链接,但是既然我们已经有了C++,为什么还需要编译C的内容?


3
为什么我们需要在 C 语言中使用 extern "C" 和 #include "foo.h"?为了实现 C++ 语言的函数重载和命名空间等特性,编译器会在编译后修改函数名和变量名等标识符。但是有些情况下,我们需要在 C++ 中调用由 C 语言编写的代码,这时候就需要使用 extern "C" 关键字来告诉编译器不要修改该函数的名称。同时,为了解析该函数的参数类型和返回值类型,我们还需要包含对应的头文件,通常使用 #include "foo.h" 的形式。 - Aamir
相关:https://dev59.com/P3NA5IYBdhLWcg3wPLP- https://dev59.com/lXRB5IYBdhLWcg3wHkLi https://dev59.com/iHRB5IYBdhLWcg3w1Kle - Nick Dandoulakis
2个回答

38

extern "C"可以避免名称的混淆。

它被用于以下情况:

  1. 我们需要在C++中使用一些C库

extern "C" int foo(int);
  • 我们需要将一些C++代码导出为C

  • extern "C" int foo(int) { something; }
    
    我们需要解析共享库中的符号——因此我们需要消除名称修饰。
    extern "C" int foo(int) { something; }
    ///
    typedef int (*foo_type)(int);
    foo_type f = (foo_type)dlsym(handle,"foo")
    

    17

    使用 extern "C" 的一个适当场景是,当你需要链接到一个被编译为 C 代码的库时。

    extern "C" {
      #include "c_only_header.h"
    }
    
    否则,可能会出现链接器错误,因为库中包含具有C链接的函数(_myfunc),但是C++编译器将库的头文件处理为C++代码,并为这些函数生成了C++符号名称("_myfunc@XAZZYE" - 这称为名称修饰,对于每个编译器都不同)。
    另一个使用extern "C"的地方是即使对于在C++中编写的函数也要保证C链接,例如。
    extern "C" void __stdcall PrintHello() {
      cout << "Hello World" << endl;
    }
    

    这样的函数可以被导出到DLL中,然后可以从其他编程语言中调用,因为编译器不会篡改它的名称。如果您添加了同名的另一个重载函数,例如:

    extern "C" void __stdcall PrintHello() {
      cout << "Hello World" << endl;
    }
    extern "C" void __stdcall PrintHello(const char *name) {
      cout << "Hello, " << name << endl;
    }
    

    大多数编译器都会捕获这种情况,从而防止你在DLL公共函数中使用函数重载。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接