user-0 提问: 小女入行，问个编程时遇到的问题“在头文件中定义全局变量/静态变量”

回复:
user: user-1
content: 要点： 多次声明，一个定义。 使用前需声明（可以无定义）。

user: user-2
content: 七楼人才，有好多程序员不能清楚的搞明白这些基础问题，包括我

user: user-3
content: 我也遇到过同样的问题，当时花了我三天的时间才找出问题的所在。 所以印象特别深刻。  7楼的解答很到位  赞一个

user: user-4
content: 13楼正解！

user: user-5
content: 引用 11 楼 drlsdrls 的回复:小妹妹好，7楼分析的很好了，补充一下 1.你可以用取地址方法看看那两个同名的静态变量的地址是不是相同，我猜应该是不同的。  2.你那个#ifdef大概没写对，你再仔细分析分析，一般只会包含一次的。 #ifndef ABC #define ABC //第一次定义ABC并申明你的变量，第二次ABC已经被定义直接退出 申明你的变量 #endif  3.这个才是通常的做法。 不知道你7楼的到底看懂了没有，不是#ifndef没写对,是写了也压根没用。他只能解决同一个文件内重复包含声明的问题，但是重复定义是由于不同编译单元造成的。每个.c或.cpp文件都是独立编译，最后由链接器连接起来的，每个文件都有一个独立的版本，单独存放是没有问题的，错误的是把这些内容链接在一起，造成了同一作用域内有相同的变量名字。

user: user-6
content: 1)x.h   extern int a[M][N]   x.c     int a[M][N] ={....}; 2)  x.h #if defined(IMPLLENT_XXX)  int a[M][N] ={....}; #else   int a[M][N]; #endif  x.c #define IMPLLENT_XXX #include"x.h"  一般都采用第一种方式.

user: user-7
content: 引用 13 楼 Adol1111 的回复:[quote=引用 11 楼 drlsdrls 的回复:] 小妹妹好，7楼分析的很好了，补充一下 1.你可以用取地址方法看看那两个同名的静态变量的地址是不是相同，我猜应该是不同的。  2.你那个#ifdef大概没写对，你再仔细分析分析，一般只会包含一次的。 #ifndef ABC #define ABC //第一次定义ABC并申明你的变量，第二次ABC已经被定义直接退出 申明你的变量 #endif  3.这个才是通常的做法。 不知道你7楼的到底看懂了没有，不是#ifndef没写对,是写了也压根没用。他只能解决同一个文件内重复包含声明的问题，但是重复定义是由于不同编译单元造成的。每个.c或.cpp文件都是独立编译，最后由链接器连接起来的，每个文件都有一个独立的版本，单独存放是没有问题的，错误的是把这些内容链接在一起，造成了同一作用域内有相同的变量名字。[/quote]   是我误会了，我以为lz说的是h1.h和h2.h都声明了同一个变量，然后在同一个c文件里include这两个头文件。 如果是在一个h文件里用这样写：  #ifndef ABC #define ABC //第一次定义ABC并申明你的变量，第二次ABC已经被定义直接退出 int test = 0; #endif  那么因为#define的作用域是到文件的结尾，所以在另一个c文件里编译器就不会认为ABC已经定义过，所以又会定义一次test，那么连接的时候就会造成重名error。

user: user-7
content: 引用 楼主 cherishsxy 的回复:    小女程序员刚刚入行，这几天写代码时将全局变量定义放在了.h中并进行了初始化，由于两个无关.c都包含了该头文件，则在编译时一直报错“重定义”，后来问同事他们说需要定义成静态变量，或者在头文件中就不要定义初始化全局变量，我试了一下果然如此。后来我将一个.c中的#include去掉了包含，也可以编译通过，自己有些问题，希望大家帮我指导一下~~    1、全局变量初始化和静态变量初始化有何不同呢？在两个.c中都包含该.h时是不是初始化不同造成了编译结果不同。    2、在头文件中的#ifndef #define #endif 不是可以限制头文件打开定义的次数么？那为何两个都包含时都会定义并初始化里面的全局变量    3、由于该全局变量是多个二维数组，不想放在主程序中初始化，那如果我将该全局变量的定义和初始化放在另一个.c中，再在这个头文件中生命，用其他.c引用是不是就可以了？？     谢谢大家驻足解答~~~~  小妹妹好，7楼分析的很好了，补充一下 1. 你可以用取地址方法看看那两个同名的静态变量的地址是不是相同，我猜应该是不同的。  2. 你那个#ifdef大概没写对，你再仔细分析分析，一般只会包含一次的。 #ifndef ABC #define ABC //第一次定义ABC并申明你的变量，第二次ABC已经被定义直接退出 申明你的变量 #endif  3. 这个才是通常的做法。

user: user-8
content: static的话，每个c中使用的变量就不是同一个了，如果你是想使用同一个变量，这样是不行的，你可以在c中定义变量，然后在头文件中extern 这个变量，然后其他c文件包含就没问题了。

user: user-9
content: 我觉得 7 楼解释的比较透彻  楼主公司内同事 加 static 的做法，虽然能编译通过，但3个文件中的变量其实是不同的。

user: user-10

user: user-11
content: 1 源代码变成程序需要经过编译和链接两个阶段，编译时以.c文件为单位逐一编译成模块，链接时将编译得到的各模块联到一起 #include的作用是把一个文件的内容全部复制到另一个文件中 所以，如果你在一个头文件中定义了一个全局变量，在两个源文件中include了这个头文件，实际上等价于你在两个源文件中定义了这个全局变量，在各文件编译时两个模块都有了叫这个名字的全局变量，链接时就冲突了。跟你赋的初值没关系，就是两个全局变量不能同名。 使用静态变量是可以的，因为静态变量仅在模块内部可见，相当于两个模块各有一个叫这个名字的变量，彼此看不到对方的那个 2 #ifdef这一套是为了避免“一个源文件多次包含一个头文件”的，对于“多个源文件包含一个头文件因此定义了同名全局变量”没有作用 3 在一个.c文件中定义，在.h文件中用extern声明

user: user-12
content: 2楼提出了核心思想，4楼提出了可操作性建议，其余楼层貌似无法满足楼主需求。  核心是，什么是声明，什么是定义，怎么声明，怎么定义的问题。

user: user-13
content: 引用 楼主 cherishsxy 的回复:    小女程序员刚刚入行，这几天写代码时将全局变量定义放在了.h中并进行了初始化，由于两个无关.c都包含了该头文件，则在编译时一直报错“重定义”，后来问同事他们说需要定义成静态变量，或者在头文件中就不要定义初始化全局变量，我试了一下果然如此。后来我将一个.c中的#include去掉了包含，也可以编译通过，自己有些问题，希望大家帮我指导一下~~    1、全局变量初始化和静态变量初始化有何不同呢？在两个.c中都包含该.h时是不是初始化不同造成了编译结果不同。    2、在头文件中的#ifndef #define #endif 不是可以限制头文件打开定义的次数么？那为何两个都包含时都会定义并初始化里面的全局变量    3、由于该全局变量是多个二维数组，不想放在主程序中初始化，那如果我将该全局变量的定义和初始化放在另一个.c中，再在这个头文件中生命，用其他.c引用是不是就可以了？？     谢谢大家驻足解答~~~~  在头文件中，使用static定义全局初始化变量，这种做饭最简单，别的地方定义都比较麻烦

user: user-14
content: 头文件件中只作声明, 不要定义. 变量的声明方式是在前里面extern 比如 extern int g_Value;  变量的定义都放到.cpp中. .ccp中定义如: int g_Value;

user: user-0
content: 公司里的代码加密了，拷不上来.....现在编译过了 主要是想问问包含和变量初始化问题~

user: user-15
content: 在 .h 中 申明 全局变量/静态变量； 在 .c/cpp 中 定义 全局变量/静态变量

user: user-16
content: 重定义？ 简要贴一下三个文件的code