C和C++关于变量声明的区别以及一个矛盾的现象

来源:互联网 发布:网络教育好不好毕业 编辑:程序博客网 时间:2024/05/16 08:25

什么都不说了,先贴代码吧,在VS2010里面输入以下代码(MAC Book没电了(电源不想找,不能在MAC OS XCode里面测试了))

//A.c fileintiValue;


 

//B.c fileintiValue;


 

//main.c file#include <stdio.h>extern intiValue;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++的标准了。

    代码如下:

 
    这代码肯定会链接失败,因为根据C++标准,A.cpp和B.cpp里面的iValue都是定义,那么链接的时候自然会报重定义错误。

 

    提问:

        关于上述问题,VS为何与C语言的标准不符合。

原创粉丝点击