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++的标准,慢慢的你会纠正好多平时养成的不好的习惯。

 

 

 

 

 

 

 

 

 

 

 

      如果转载请注明引用出处,谢谢!!!(尊重别人的劳动成果)