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

22 篇文章 0 订阅
14 篇文章 0 订阅

    什么都不说了,先贴代码吧,在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语言的标准不符合。


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值