zoukankan      html  css  js  c++  java
  • C语言中定义全局变量

    (1)在C语言的头文件中定义变量出现的问题

    最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:
      /*xx头文件*/
      #ifndef 
      _XX_头文件.H
      #define 
      _XX_头文件.H
      int A;
      #endif

    那么,很糟糕的是,这里的int A
    是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义,显然语法上错了。只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次,不过也许还是不会出岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量

    错误警告:Linking...
    incl2.obj : error LNK2005: "int glb" (?glb@@3HA) 
    already defined in incl1.obj
    Debug/incl.exe : fatal error LNK1169: one 
    or more multiply defined symbols found

    正确的作法是在c源文件中定义一个全局变量。在头文件中加入全局变量的声明

    //var.c 一个主要用于定义全局变量的c源文件

    int g_a;
    char g_x;
    //var.h 用于声明定义的全局变量
    extern int  g_a;//使用extern在头文件中声明全局变量
    extern char g_x; 
     
     
    //test.c 一个用于测试的头文件
    #include <var.h>
    void f(){
        g_a = 1;
        g_x = 'x';
    }
     
    (3)头文件中只是变量或着函数的声明,不是定义
     
    对变量而言,如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量;
     
    对函数而言,如果你想在本源文件中使用另一个源文件的函数,就需要在使用前用声明该变量,声明函数加不加extern都没关系,所以在头文件中函数可以不用加extern。
     
    为了在几个源文件中共享变量i,首先把变量i的定义放置在一个源文件中: int i; 如果需要对变量i初始化,那么可以在这里放初始值。在编译这个文件时,编译器将会为变量i分配内存空间,而其他文件将包含变量i的声明: extern int i; 通过在每个文件中声明变量i,使得在这些文件中可以访问/或修改变量i。然而,由于关键字extern,使得编译器不会在每次编译其中某个文件时为变量i分配额外的内存空间。当在文件中共享变量时,会面临和共享函数时相似的挑战:确保变量的所有声明和变量的定义一致。为了避免矛盾,通常把共享变量的声明(extern int i;)放置在头文件中。需要访问特殊变量的源文件可以稍后包含适当的头文件。此外,含有变量定义的源文件包含每一个含有变量声明的头文件,这样使编译器可以检查两者是否匹配。
  • 相关阅读:
    【xinsir】githook之precommit分享
    node进程一些信号的意义
    ES6篇
    Webpack4篇
    Node篇
    Vuex篇
    WebStorage篇
    HTML5篇
    html5语义化标签大全
    emmet语法
  • 原文地址:https://www.cnblogs.com/hai5111/p/6227365.html
Copyright © 2011-2022 走看看