C++ 和 C语言 头文件使用全局变量的异同
来源:互联网 发布:智能云网络摄像头app 编辑:程序博客网 时间:2024/05/22 06:17
最近感觉发现对头文件中使用全局变量的概念还是有些模糊,就索性研究好好研究下,进一步打好基本功。而且还发现对于头文件中使用全局变量C语言和C++还是存在区别的。
对于普通的头文件的构建都是使用:
#ifndef XXX.H
#define XXX.H
........................
........................
#endif //XXX.H
这句话大家也都明白就是为了防止头文件被重复引用,但是这里边有个疑问,是被谁重复引用?
我们知道对于宏名的有效范围是本源文件.换句话说防止在同一个源文件中同一个头文件被重复引用。对于不同的源文件同一个头文件还是会继续被使用。明白了这个概念我们就继续下面的讨论。
我曾经做过这样的实验,代码如下:
//test.h
//source1.c
//source2.c
这个例子是用C语言
然后用gcc source1.c source2.c
命令去编译,奇怪的是编译能够通过.而且还能正常的运行。
运行结果如下:
[in source1.c] printf a=0
[in source2.c printf a=0]
不是说在头文件中定义的全局变量在多个源文件中使用在链接的时候出现
“multiple definition of ” 错误?
接着我做了以下修改把source1.c--->source1.cpp
source2.c--->source2.cpp
执行g++ source1.cpp source2.cpp
发现:出现multiple definition of `a' error.
同样的代码用g++ 和 gcc 来编译就会出现两种截然不同的结果。
难道只是C++遵守头文件中定义的全局变量在多个源文件中使用在链接的时候出现多重定义的错误?
在C语言风格的代码里面修改test.h
改成:
然后执行gcc source1.c source2.c
同样也会出现多重定义的错误。
原来在C99中针对C语言有这样的一种说法C语言有默认的存储类型标志符。也就是说第一次能够编译通过两个源文件其中有一个对于
int a; 实际上被编译器隐式的加上 extern int a; 导致能够编译成功,也能够运行成功
而C++ 编译器检查更加的严谨,所以提前报出错误。这也是C++语言在C语言基础上的一个改进。
通过上面的例子我们可以得出一个结论那就是头文件中定义和声明全局变量是两种不同的意识形态,定义的时候系统会真正的申请内存,而声明只是告诉一下,说存在这样的变量,别人可以使用。上面造成误解的原因就是 int a ;既可以表示声明又可以表示定义,这个误解最终原因是编码不严谨。在平时的编程过程中尽量少使用一些有歧义的表达式语句。
当然上面举的这个例子在实际中大家也不怎么去使用,一般的全局变量的使用都是同在头文件中声明,在源文件中定义来使用的模式,而且在定义的时候要初始化一下。
下面是大家经常使用全局变量的代码范例:
//test.h
//source1.c
//source2.c
上面是本人在平时编码过程中积累的一点点经验,希望借鉴给大家,有不对的地方希望大家指出。
另外针对头文件定义和声明 函数以及const 类型的全局变量我会在以后的章节慢慢给大家提供具体的应用实例以及注意事项。
面对茫茫的代码大潮中,建议大家挤出时间看看C语言或者C++的标准,慢慢的你会纠正好多平时养成的不好的习惯。
如果转载请注明引用出处,谢谢!!!(尊重别人的劳动成果)
- C++ 和 C语言 头文件使用全局变量的异同
- [C语言项目]防止头文件和全局变量重复定义
- [C语言]防止头文件和全局变量重复定义
- C语言头文件定义全局变量问题
- 在C语言头文件里“定义”全局变量的方法
- c语言中头文件的建立与使用-函数、全局变量、全局数组
- C语言头文件的使用
- C语言头文件的使用
- C语言头文件的使用
- C语言头文件的使用
- C语言头文件的使用
- C语言头文件的使用
- c语言头文件的使用
- C语言关于头文件的使用
- C语言关于头文件的使用
- C语言关于头文件的使用
- C语言头文件的使用
- C语言头文件的使用
- SQL SERVER取第几行到第几行的方法(包括2000和2005+)
- A标签在新的页面中打开,而不是就地打开
- 关于View::setTag()跟getTag()
- 原来年薪300000依旧是个悲剧
- 文件下载
- C++ 和 C语言 头文件使用全局变量的异同
- 长度N数组,计算N-1长度的子数组乘积的最大值
- 浅谈Linux下Java运行环境的建立
- 进程和线程的差别
- Sql Server 2005出现尚未备份日志尾部的问题
- windows和linux的内存管理
- 面向对象UML中类关系
- 在asp.net 2.0下后台向前台发脚本、弹出框的方法
- “系统无法执行指定的程序”的解决办法