"extern C", 你真的懂了吗?

       在c++ prime书中看到过,在DLL和lib中看到过,但是每次看过就不求甚解地一扫而过。心里知道有extern c这个语句,却不知道该用在哪里,又能起到什么作用。唉,想想自己也算是写过不少CODE的人了,可这种眼高手低的毛病却从没改变过。今天突然想起extern这个关键字,遂决定不能再这么浪费时间了。开动google,人肉了一把extern这小子,要说搜索引擎真是个好东西,什么都逃不过人家的眼睛。

 

      今天就在这里把extern这老小子给说明白了,也算有个白纸黑字吧。

 

      首先,你要搞明白,extern是C++的关键字。那么为什么C++会有这个关键字呢?

      各位看官应该知道,C++对相同函数名,但是不同函数参数的函数有重载这个功能吧,bingo! hey man, you got the key! 对了,C++编译器会在编译时把重载的函数的函数名修改为不同的函数名,这就是为啥C++能够进行重载的原因。举个例子吧。

       int a(char) int a(int) int a(double)...

       知道编译后,这些函数a会变成什么吗?我也不知道,应该不同的C++编译器有不同的实现方式,有可能会是这样的样子:a_char_xxx,a_in_xxx,a_double_xxx。这是原理,各位有疑问的,我也就只能解释到这个地步了,更进一步地理解,看官们可以参考侯捷大神翻译的《深入探究C++对象模型》,里面有更详细的陈述。 

 

       以上是存在extern这个关键字的原因。但是存在extern这个关键字的作用有哪些呢?

       很简单啦,"extern c"的作用就是告诉C++编译器不要再给我改变函数名了,我就要原样的函数名,谢谢。

       还是上面的例子:

       extern "c" { int a(char); }

       这样,C++编译器就会尊敬地回答你,“好的,主人,听你的”。编译后的符号还是a,而不是a_char_xxx等等。

       那么这个时候,你可能会问,我知道了,可是这样做有什么用呢?就是不加extern,我还是能编译通过啊,我还是能正常执行啊。没错,这些你都能做到,但是,当这些函数被封装在一个库里呢?而这些函数你只知道声明,也就是int a(char),经过C++编译的魔术变化,请问这个时候,你确定你还能编译通过吗?

 

       而这时,extern "c"就起作用了。转一段吧,我也说不太清楚。有看的懂的大侠,给解释一下吧。

 

在DLL的对外接口函数中,必须用exter "C" 限制,否则,外部调用者根本不知道你的真正函数名.

1 VC6.0编译器可以按C++或C生成目标函数. 两者生成的目标符号表并不一样. C方式是与原来标准C相兼容.
2 在DLL中的接口函数一般应按C方式编译而成. extern "C" 就是强制指定. 如果不按这种方式指定.GetProcAddress(...)取出来的就不对. 只能隐式连接.
extern "c" 的作用就是使得函数的定义名称和导出名称一致。

你可能感兴趣的:(C/C++,c,编译器,dll,搜索引擎,google)