什么都不说了,先贴代码吧,在VS2010里面输入以下代码(MAC Book没电了(电源不想找,不能在MAC OS XCode里面测试了))
//A.c file
int iValue;
//B.c file
int iValue;
//main.c file
#include <stdio.h>
extern int iValue;
int main(){
printf("%d\n", iValue);
}
C语言有如下标准:
当一个变量在外围声明的时候没有进行初始化,那么这个变量不能算定义。比如:int iValue;这代码不算定义,只能算声明。
根据C标准,以上的A.c和B.c里面的iValue只能算声明,那么,这个程序在链接的时候应该会报错(没有找到iValue的定义),但是,我在VS上面测试的结果表明程序运行成功,并且输出的结果是0。
相对 C语言的没有初始化的变量声明不能算定义而言,C++并不与之一样地对待,C++有如下规定:
1,进行初始化的变量是定义。如int iValue= 0;或者extern int iValue = 0;这就算iValue的定义(有初始化)。
2,不进行初始化的变量且前面没有extern关键字的变量也是定义。比如int iValue;就算iValue的定义,但是,extern int iValue就只能算声明了(有extern 关键字)。
与C不符合的理由理由:
这个标准之所以与C不符合是因为C++里面有默认构造函数,比如class CT object,你肯定不能说它是object的声明。
另外,如果用C++进行编译,VS2010又符合C++的标准了。
代码如下:
//A.cpp file
int iValue;
//B.cpp file
int iValue;
//main.cpp file
#include <stdio.h>
extern int iValue;
int main(){
printf("%d\n", iValue);
}
这代码肯定会链接失败,因为根据C++标准,A.cpp和B.cpp里面的iValue都是定义,那么链接的时候自然会报重定义错误。
提问:
关于上述问题,VS为何与C语言的标准不符合。