C ++ extern "C"的用法

   在C++的很多代码中,我们经常看到有extren "C"的代码片段,很多人并不清楚其中的含义。而且,我们在C/C++中还会经常看到一个关键字,extren。因此,这样造成了很多的用法和理解上的混淆。

    我们先说一下extren关键字,这个关键字在C中就已经存在了,它是用来修饰一个变量的。例如:extren const int m_val;这是告知编译器,该变量已经在其他文件中有所定义,此处是将其进行声明扩展,以便于这个变量在当前文件的使用。这种用法也是为了方便模块间的通信。

    再说,extren “C”,当这两个关键字进行组合的时候,它会有两个用法。

    1.告知编译器,当前的函数或对象,以C语言的方式进行编译和执行。之所以如此,是因为C++在C语言的基础上,对c 语言的库函数进行了进一步的封装。而我们需要在C++的代码中用到C语言的库函数。因此,通过该方式可以兼容C语言代码。

    2.告知编译器,当前函数不要偷换函数名。何意?因为C++中有一个函数名重载机制,即相同的函数名,不同的参数列表,用以实现接近的功能。而所谓的相同的函数名,其实是为了方便程序员阅读理解,在C++编译器中,都会对函数名进行添加符号。例如:

int Add(int a,int b);//在编译之后,函数名可能为 Add_fun_a_b.
int Add(float a,float b);//在编译之后,函数名可能为Add_fun_floatab;

    当我们不希望编译器将函数名更改时,则引入extren "C"。即告知编译器,被修饰的函数,在编译之后,函数名仍然不被修改。

    当然,第二种在实际使用中并不常见,而在一些dll的编写过程中,则是大量的出现。

    为什么会有这种需求呢?这就不得不称赞C++设计者的高明和灵活之处了。由于编译器厂商的不同,对C++的实现方式也有不同。不同的编译器对相同的函数名重载的规则略有不同,即编译之后的函数名会不同。而对于dll而言,我们需要兼容不同的编译器,所以阻隔掉因编译器类型不同,而造成的函数入口无法正确定位的问题。所以,才会有这种的使用方式。

猜你喜欢

转载自blog.csdn.net/helinlin007/article/details/51886861