extent static const

来源:互联网 发布:亚马逊 知乎 编辑:程序博客网 时间:2024/06/05 20:10

  extern:这就是告诉编译器,这个变量或函数在别的编译单元里定义了,也就是要把这个符号放到未解决符号表里面去(外部链接)。

     static:如果该关键字位于全局函数或者变量的声明前面,表明该编译单元不导出这个函数或变量,因些这个符号不能在别的编译单元中使用(内部链接)。如果是static局部变量,则该变量的存储方式和全局变量一样,但是仍然不导出符号。 

     默认链接属性:对于函数和变量,默认链接是外部链接,对于const变量,默认内部链接。

     外部链接的利弊:外部链接的符号在整个程序范围内都是可以使用的,这就要求其他编译单元不能导出相同的符号(不然就会报

duplicated external symbols)。

     内部链接的利弊:内部链接的符号不能在别的编译单元中使用。但不同的编译单元可以拥有同样的名称的符号。

     为什么头文件里一般只可以有声明不能有定义:头文件可以被多个编译单元包含,如果头文件里面有定义的话,那么每个包含这头文件的编译单元都会对同一个符号进行定义,如果该符号为外部链接,则会导致duplicated external symbols链接错误。 

     为什么公共使用的内联函数要定义于头文件里:因为编译时编译单元之间互不知道,如果内联被定义于.cpp文件中,编译其他使用该函数的编译单元的时候没有办法找到函数的定义,因些无法对函数进行展开。所以如果内联函数定义于.cpp里,那么就只有这个.cpp文件能使用它。


对于函数和变量,默认的是外部链接,但是如果是const 变量,则是内部链接。const和static就是把变量变为内部变量,外部不可以用。但是extent const变量,外部可以用,但是不能修改。

例如:

在t.cpp的定义如下:

int at = 7;

const int c = 9;

extern const int bt = 3;


在main.cpp

extern int at;//全局变量都是外部变量,其他编译单元只要加extern就可以引用。所以extern的作用就是,这个变量不是在本编译单元定义的
extern void f();//和全局变量一样
int bt = 8;//


int main() {

cout<<at<<endl;
   f();
 
   cout<<d<<endl;
    return 0; 

}