C++链接属性

编译器将.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的这样的用法,前者是外部链接,后者是内部链接。

猜你喜欢

转载自blog.csdn.net/qq_37581730/article/details/114437048
今日推荐