全局变量在C,C++中的区别
1,非const全局变量
在C中,应该在一个.c文件中定义int i = 9;在头文件中声明extern int i;
这么做非常ok。但是万一手残没有定义,只在头文件中写了一个 int i;依旧不会出错,也不会重定义。
甚至在一个文件中这样
int i; int i; int i; int i;
int main(){
i = 9;
return 0;
}
也不会出错。。。在C中逗比编译器会把其中一个int i当作定义,其他的当成声明。
更奇葩的是在C中如果函数没有声明直接使用也可以,只要之后链接器能为它找到一个定义,而且只要名字一样哪怕参数个数跟类型不一样也不会报错(参数在汇编里用栈传递的记得么。。链接器不知道什么参数个数的好吧)
不过会出一个 implict declaration of function的警告,说隐式声明了一个函数。
而在C++中,一堆全局的int i;可就是实打实的定义了n个初始值为0的全局变量,妥妥的重定义。
2,const全局变量
在C中可以写const int i;然后逗比gcc会把它当成声明。然后只要你在其他什么地方定义了一句const int i = 9;什么的就不会报错,当然如果不定义或者重定义肯定会报错的。
在C++中写一个全局的const int i;就是定义了一个全局的const int类型还没给初值,报错。但是C++中的全局const int x是默认static的!我们可以在每个文件都写一句const int x,然后取个地址还不一样,但是如果我们没有显式的取地址的话,编译器会进行优化,只分配一个空间甚至在生成代码的时候直接那立即数替换,不分配空间。
但是如果在C里面每个文件都写一句const int x就会报重定义。。
总的说来就是说老老实实的用extern在头文件声明,然后再写个c或者cpp文件进行定义就不会出错, 不过在C++中的定义也得加上extern,否则默认成static的话是对别的文件不可见的-0 -
至于为什么c++中const 全局变量会是static的呢,因为这样如果把const int x = 9;放进头文件中拿来当#define x 9使的话,在编译器优化后效率完全一样而且还能在出错信息里边看到x而不是9;
浙公网安备 33010602011771号