在头文件中中定义全局变量的问题

shixiazuike 2014-04-17 12:41:53
使用#ifndef在头文件中定义全局变量,然后两个.c文件分别访问,编译时就会出现multiple definition的提示,但是已经使用了条件编译,理论上第二次应该跳过定义过程,这是为什么呢?
...全文
2827 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-04-22
  • 打赏
  • 举报
回复
尽量避免使用全局变量。
FrankHB1989 2014-04-22
  • 打赏
  • 举报
回复
引用 16 楼 shixiazuike 的回复:
[quote=引用 8 楼 mcmay 的回复:] [quote=引用 6 楼 zmlovelx 的回复:] 在头中声明,某个.c中定义, 其他.c中使用。
正解[/quote] 请问怎么在头文件中声明呢,对于一个基本类型,声明也就是定义了,已经分配内存空间了。[/quote] extern int i;
shixiazuike 2014-04-22
  • 打赏
  • 举报
回复
引用 8 楼 mcmay 的回复:
[quote=引用 6 楼 zmlovelx 的回复:] 在头中声明,某个.c中定义, 其他.c中使用。
正解[/quote] 请问怎么在头文件中声明呢,对于一个基本类型,声明也就是定义了,已经分配内存空间了。
shixiazuike 2014-04-22
  • 打赏
  • 举报
回复
引用 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就可以了,不过在大型工程项目中应该很有难度。
fly 100% 2014-04-22
  • 打赏
  • 举报
回复
那个编译只是在.h里面有效吧
luotuo44 2014-04-21
  • 打赏
  • 举报
回复
引用 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文件。这样就会出现包含一个头文件多次的情况。这时条件编译就能派上用场了。
shixiazuike 2014-04-21
  • 打赏
  • 举报
回复
引用 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的情况,我认为这应当是尽量避免的。
shixiazuike 2014-04-21
  • 打赏
  • 举报
回复
引用 6 楼 zmlovelx 的回复:
在头中声明,某个.c中定义, 其他.c中使用。
请问怎么在头文件中生命呢,比如一个全局变量int a,声明也就是定义了,理论上就分配了内存空间,除非使用静态类型,但是这就改变了问题的条件了。
luotuo44 2014-04-18
  • 打赏
  • 举报
回复
引用 3 楼 shixiazuike 的回复:
但是如果宏只对单个.c文件有效,那么条件编译有什么作用呢?

#ifndefine
#define
#endif
这类条件编译是为了防止同一个.c文件包含同一个头文件多次。 楼主要明白:每一个.c文件最后都会编译生成对应的.obj文件的。所以你的两个.c文件对应的两个.obj文件都会有你说的那个全局变量的,链接的时候,链接器就会发现有定义了两个同名变量,于是就报multiple definition错误。 正确的做法是:是其中一个.c文件定义这个变量,在另外一个.c文件用

extern int g_a;
声明,这就可以在两个.c都使用这个变量了。
shixiazuike 2014-04-17
  • 打赏
  • 举报
回复
但是如果宏只对单个.c文件有效,那么条件编译有什么作用呢?
heipacker 2014-04-17
  • 打赏
  • 举报
回复
把代码贴出来
shixiazuike 2014-04-17
  • 打赏
  • 举报
回复
经过我的测试,宏似乎只针对单个.c有效。
  • 打赏
  • 举报
回复
引用 1 楼 shixiazuike 的回复:
经过我的测试,宏似乎只针对单个.c有效。
好像不是的啊 我今天编译的时候在一个项目下 另一个类就拿到那个宏定义了啊
lin5161678 2014-04-17
  • 打赏
  • 举报
回复
引用 3 楼 shixiazuike 的回复:
但是如果宏只对单个.c文件有效,那么条件编译有什么作用呢?
文件A 包含文件B 同时有自己特有的内容 文件C同时 包含文件A 和 文件B 如果不做条件编译 在文件C 文件B会被包含2次 当然你也可以说 文件C只包含文件A 就能有同样的效果啊 我会告诉你 的确是那样 然后对于一个几百个头文件的小项目 你这么干试试
mangoalx 2014-04-17
  • 打赏
  • 举报
回复
通常每个c文件是各自编译的,你别指望在一个c文件中的条件可以拿来在另一个c文件中做判断,所以#if这种情况不管用
mcmay 2014-04-17
  • 打赏
  • 举报
回复
引用 6 楼 zmlovelx 的回复:
在头中声明,某个.c中定义, 其他.c中使用。
正解
buyong 2014-04-17
  • 打赏
  • 举报
回复
头文件就定义常量
帅得不敢出门 2014-04-17
  • 打赏
  • 举报
回复
在头中声明,某个.c中定义, 其他.c中使用。
Kingnus 2014-04-17
  • 打赏
  • 举报
回复
那是因为你在.h 文件中,也加入了extern xxx ,只在.C 文件中加入extern xxx 即可。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧