C++链接属性

2017-01-01 10:25:07来源:CSDN作者:LaoJiu_人点击

第七城市

欢迎到我的新博客访问原文链接:http://www.61mon.com/index.php/archives/165/

  编译器将.cpp编译成.obj,而.obj就是编译单元
  一个程序,可以由一个编译单元组成,也可以由多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧。那么就是一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,这就是程序了。
  如果一个.cpp要用到另一个.cpp定义的函数怎么办?
  只需在这个.cpp中写上他的函数声明就可以了,其余工作由链接器帮你完成,你可以随便调用该函数,链接器将所有的.obj连接起来,但是注意如果有相同的函数或外部变量,这会报重定义的错误,例如下面两个源文件source1.cpp和source2.cpp:

/***@file  source1.cpp*@brief  在source1.cpp中定义一个函数func(),文件内容如下*/void func(){}
/***@file  source2.cpp*@brief  在source2.cpp中同样定义一个函数func(),文件内容如下*/#include<iotream>void func(){}int main(){    return 0;}

  编译运行就会报重定义的错误。
  但是庆幸的是,C++可以通过一种叫做链接属性的关键字来限定,你的这个函数是属于整个程序公用的,还是只是在一个编译单元.obj内使用的。这些关键字就是extern 和 static。 extern是外部链接的意思,也就是除了这个单元,外部的单元也是能够访问这个函数的。static 是内部链接,自属于自己单元。
  下面具体分析:

内部链接属性

  static修饰的变量或函数表明是内部链接,也就是若在其它.cpp文件定义了同样的变量或函数(即使其属性是外部链接),编译也不会报错;
  const修饰的常量也是内部链接。

外部链接属性

  extern修饰的变量或函数是外部链接;
  所有的全局变量和函数默认也是外部链接;
  extern const修饰的变量也是外部链接。注意不要弄混了,没有extern static的这样的用法,前者是外部链接,后者是内部链接,混用肯定是错的。



第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台