c++,函数与连接性,编译单元:
c++中变量和函数均具有连接性,c++中不允许函数内定义函数,所有的函数的存储都是静态的,在整个程序执行期间都存在,默认情况下,函数的连接性是外连接,可以在文件间共享,不过和全局非静态变量相同,函数在不同编译单元的文件中想要被调用,需要使用extern进行声明。
编译单元:
编译器从一个cpp文件开始,依次替换其所有的包含文件,直至cpp文件与所有其包含的文件全部被整合为一个文件,然后编译器开始编译被整合的文件,这样一个大的文件就是一个编译单元,变量与函数的声明和定义可以不在同一个编译单元中,但是必须都是同一个程序的组成部分。
函数声明和定义在同一个编译单元下时:
函数声明可以不需要extern,直接声明就可以,例如:
void func();
void func(){}
这也是一般头文件和源文件的写法。
函数声明和定义不在同一个编译单元下时:
函数声明需要extern,例如:
extern void func();
函数声明和定义不在统一编译单元下,编译器也可以通过extern知道可以在其他文件中找到该函数。
如果不希望函数在其他编译单元中被使用,可以使用static显式修饰函数的定义和声明,二者都要,将函数的连接性设置为内连接,例如:
static void func();
static void func(){}
c++中查找函数时,如果函数声明指出函数是静态的,编译器就会在文件中查找函数(同一编译单元);
否则,编译器会在所有的程序文件中查找(程序中所有编译单元)。
如果编译器找到了两个函数同名同参函数的定义,编译器会发出错误消息,即报错,因为每个外部函数只能有一个定义。
如果编译器在程序文件中找不到该函数,才会在库文件中查找,因此如果有和库文件同名的函数,编译器会优先调用程序员定义的版本,而非库函数,在c++中保留了标准库函数的名称,避免程序员使用它们。
版权声明:本文为ganfanren00001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。