当前位置:   article > 正文

外部变量与全局变量_外部变量和全局变量

外部变量和全局变量

问题引出原因:

        在一个头文件a.h中定义一些变量x,在其他.c文件中(b.c,c.c)要用到,在两个*.c中包含a.h以后,
       编译时总是提示error:multiple definition of x。

解决思路:

        当时本想采用extern变量的方法,但考虑到会使用sizeof() 计算extern数组的大小,因此无法使用extern,最后只能采用static的方法,原因如下。

外部变量extern

        把所有的全局变量放入一个头文件 global.h,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();
然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。

简单的例子(头文件中声明,源文件中定义):

get_value.h

  1. extern int test_int; 外部声明
  2. extern const char *arr[];
  3. int get_value();

get_value.cpp

  1. #include "get_value.h"
  2. int test_int = 10;
  3. const char *arr[] = {"aa","bb"};
  4. int get_value(){
  5. // test_int = 10;
  6. return 0;
  7. }

main.c

  1. #include <stdio.h>
  2. #include "get_value.h"
  3. //extern int test_int;
  4. int main(){
  5.    //get_value();
  6.    printf("%d\n", test_int);
  7.    printf("%s\n", arr[0]);
  8.    printf("%d\n", sizeof(arr) / sizeof(char*)); //错误,语音如下:
  9.    return 0;
  10. }
     sizeof不能用于extern变量
           sizeof 的计算发生在代码编译 的时刻。。
           extern 标注的符号 在链接的时刻解析。。。 
           所以 sizeof 不知道 这个符号到底占用了多少空间。

用static声明
        有时在程序中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时就可以在定义外部变量时在其前面加一个static声明。此时的外部变量也成为静态全局变量。这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。

问题如下:
       三个文件a.h、a.c、b.c;
       在a.c和b.c 包含include了a.h。  
       在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
问题分析:
       static的含义是迫使那个变量只在某个文件可见。 
       假定你在头文件定义static x; 
       且这个头文件分别被a.c和b.c包含;
       实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。
       在a.c里修改x,他不会导致b.c里的x变化.

条件编译

注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。 
给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。
条件编译示例
#ifndef TEST_H
#define TEST_H
……
#endif


出错原因:一般是因为在头文件里进行了定义或者实例化,导致多重定义,记住在头文件里只进行声明。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT领航者/article/detail/63301
推荐阅读
相关标签
  

闽ICP备14008679号