`
hulianwang2014
  • 浏览: 686986 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

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

 
阅读更多

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


分享到:
评论

相关推荐

    C++类变量声明

    C++类变量声明,验证与java类声明不同的Demo

    C++中类使用全局变量

    在C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。

    C++各变量的区别

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。 4、...

    C++编程变量命名规范

    C++变量命名规范,有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量

    C++全局变量初始化的一点总结

    注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。  什么时候初始化  根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊...

    解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...

    C语言与C++区别

    C语言与C++的区别,C语言的应用及其他

    C++中的extern声明变量详解

    从内存分配角度来说,声明和定义的区别在于声明一个变量不会分配内存,而定义一个变量会分配内存。一个变量可以被声明多次,但是只能被定义一次。 基于以上前提,我们可以把声明和定义类比为指针和内存的关系。我们...

    C语言和C++在声明和定义之间的区别是什么

    C语言和C++在声明和定义之间的区别是什么?看了你就明白了

    C++变量总结 说明各种变量

    在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU中的寄存器,变量的存储属性就是讨论变量的存储位置的,C语言中定义了四种存储属性,即自动变量、外部变量、静态变量和寄存器变量,它关系到...

    c++修改系统环境变量

    c++实现修改环境变量,原帖地址忘记了,是在网易博客上找到的,分享给大家。

    一个案例 c++ 局部变量 全局变量 形式参数 实际参数练习.cpp

    一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习 一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习 一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习

    C语言和C++的区别【完整版】

    C语言和C++的区别【完整版】 讲述了c与c++的区别,极力推荐

    C/C++语言中全局变量重复定义问题的解决方法

    宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已定义 问题出现的原因 为什么会出现这种...

    C++ 包含类两个类互相调用彼此的类成员变量和方法

    C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂

    C_C++变量命名规则

    C_C++变量命名规则, 山高谷深

    C++变量命名规则

    主要是C++变量命名规则的一些常规用法。

    C语言与C++编程思想的区别

    C语言与C++编程思想的区别 C语言与C++编程思想的区别

    C++变量名规则

    常见的C++语言中变量名称的命名规则,基本涵盖了常用的一些变量说明

    C++——字符串变量.txt

    处理字符串,除了字符数组,还有用C++的string类型来定义一个字符串变量(对象)。 定义字符串并进行初始化: string string1="chance"; 注意:必须要有头文件# include ; 比较:字符数组不能直接对字符变量进行...

Global site tag (gtag.js) - Google Analytics