user-0 提问: 在头文件中中定义全局变量的问题

回复:
user: user-1
content: 尽量避免使用全局变量。

user: user-2
content: 引用 16 楼 shixiazuike 的回复:[quote=引用 8 楼 mcmay 的回复:] [quote=引用 6 楼 zmlovelx 的回复:] 在头中声明，某个.c中定义， 其他.c中使用。 正解[/quote] 请问怎么在头文件中声明呢，对于一个基本类型，声明也就是定义了，已经分配内存空间了。[/quote] extern int i;

user: user-0
content: 引用 8 楼 mcmay 的回复:[quote=引用 6 楼 zmlovelx 的回复:] 在头中声明，某个.c中定义， 其他.c中使用。 正解[/quote] 请问怎么在头文件中声明呢，对于一个基本类型，声明也就是定义了，已经分配内存空间了。

user: user-0
content: 引用 14 楼 luotuo44 的回复:[quote=引用 13 楼 shixiazuike 的回复:] [quote=引用 11 楼 luotuo44 的回复:] [quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。[/quote]  不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。 条件编译为了防止一个.c文件多次包含一个.h文件。 比如有a.h， b.h，main.c三个文件，b.h文件include了a.h文件。而在main.c文件中首先include了a.h，然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。[/quote] 恩，谢谢，这样我就懂了。虽然这种情况下不包含a.h直接包含b.h就可以了，不过在大型工程项目中应该很有难度。

user: user-3
content: 那个编译只是在.h里面有效吧

user: user-4
content: 引用 13 楼 shixiazuike 的回复:[quote=引用 11 楼 luotuo44 的回复:] [quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。[/quote]  不是一个.c文件包含另外一个.c文件。没有人会这样组织代码的。 条件编译为了防止一个.c文件多次包含一个.h文件。 比如有a.h， b.h，main.c三个文件，b.h文件include了a.h文件。而在main.c文件中首先include了a.h，然后再include了b.h文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。

user: user-0
content: 引用 11 楼 luotuo44 的回复:[quote=引用 3 楼 shixiazuike 的回复:] 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。[/quote] 恩，谢谢，我最后就是用extern来解决的，只不过对于条件编译有些疑问而已。因为目前没有遇到过一个.c文件包含另一个.c的情况，我认为这应当是尽量避免的。

user: user-0
content: 引用 6 楼 zmlovelx 的回复:在头中声明，某个.c中定义， 其他.c中使用。 请问怎么在头文件中生命呢，比如一个全局变量int a，声明也就是定义了，理论上就分配了内存空间，除非使用静态类型，但是这就改变了问题的条件了。

user: user-4
content: 引用 3 楼 shixiazuike 的回复:但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？  像  #ifndefine #define #endif  这类条件编译是为了防止同一个.c文件包含同一个头文件多次。  楼主要明白：每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的，链接的时候，链接器就会发现有定义了两个同名变量，于是就报multiple definition错误。 正确的做法是：是其中一个.c文件定义这个变量,在另外一个.c文件用  extern int g_a;  声明，这就可以在两个.c都使用这个变量了。

user: user-0
content: 但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？

user: user-5
content: 把代码贴出来

user: user-0
content: 经过我的测试，宏似乎只针对单个.c有效。

user: user-6
content: 引用 1 楼 shixiazuike 的回复:经过我的测试，宏似乎只针对单个.c有效。 好像不是的啊 我今天编译的时候在一个项目下  另一个类就拿到那个宏定义了啊

user: user-7
content: 引用 3 楼 shixiazuike 的回复:但是如果宏只对单个.c文件有效，那么条件编译有什么作用呢？ 文件A 包含文件B 同时有自己特有的内容 文件C同时 包含文件A  和 文件B 如果不做条件编译 在文件C 文件B会被包含2次  当然你也可以说 文件C只包含文件A 就能有同样的效果啊  我会告诉你 的确是那样  然后对于一个几百个头文件的小项目 你这么干试试

user: user-8
content: 通常每个c文件是各自编译的，你别指望在一个c文件中的条件可以拿来在另一个c文件中做判断，所以#if这种情况不管用

user: user-9
content: 引用 6 楼 zmlovelx 的回复:在头中声明，某个.c中定义， 其他.c中使用。 正解

user: user-10
content: 头文件就定义常量

user: user-11
content: 在头中声明，某个.c中定义， 其他.c中使用。

user: user-12
content: 那是因为你在.h 文件中，也加入了extern xxx ，只在.C 文件中加入extern  xxx 即可。