首页 > 试题广场 >

在 c++ 程序中调用被 c 编译器编译后的函数,为什么要加

[问答题]

c++ 程序中调用被 c 编译器编译后的函数,为什么要加 extern  “C” 声明?

C++提供了C连接交换指定符号extern "C"来解决名字匹配的问题。由于C++是支持函数重载的,所以C++编译函数之后在库中的名字和形参的类型与个数有关,例如void foo(int x,int y)在C++编译器编译之后产生_foo_int_int之类的名字用来支持函数重载和类型安全连接。而C语言不支持函数重载,C编译器产生的库函数名字都类似_foo,没有包含形参的类型和个数。C++添加extern"C"声明就是为了告知编译器在库中找_foo的函数而不是_foo_int_int
发表于 2017-08-17 15:08:31 回复(0)
更多回答

首先, extern C/C++ 语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字 extern 声明。 extern "C" 是连接申明 (linkage declaration), extern "C" 修饰的变量和函数是按照 C 语言方式编译和连接的。作为一种面向对象的语言, C++ 支持函数重载,而过程式语言 C 则不支持。函数被 C++ 编译后在符号库中的名字与 C 语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被 C 编译器编译后在符号库中的名字为 _foo ,而 C++ 编译器则会产生像 _foo_int_int 之类的名字。这样的名字包含了函数名、函数参数数量及类型信息, C++ 就是靠这种机制来实现函数重载的。

所以,可以用一句话概括 extern C ”这个声明的真实目的 : 解决名字匹配问题,实现 C++ C 的混合编程。

发表于 2017-03-05 10:00:26 回复(0)
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或其他模块中使用。extern "C"的作用是实现C++语言与C语言
及其他语言的混合编程。被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,而不是
C++语言的。由于C++语言支持函数重载,因此,编译器编译函数的过程中会将函数的参数类型
也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此,在编译C语言
代码的函数时不会带上函数的参数类型,一般只包括函数名。例如如果使用C语言开发了一个
DLL库,为了让C++语言也能够调用DLL输出(Export)的函数,此时需要使用extern "C"来强
制编译器不要修改函数名。
发表于 2018-07-07 16:50:45 回复(0)
答案:c++支持函数重载,c不支持函数重载。假设某个函数的声明如下,void f(int x,int y);该函数被C编译器编译后在库中的名字为_f,而c++编译器则会产生像_f_int_int之类的名字来支持函数重载和类型安全链接。由于编译后的名字不同,c++程序不能直接调用c函数。c++提供了一个C连接交换指定符号
extern "C"来解决这个问题。
发表于 2017-01-23 16:58:25 回复(0)