加了条件编译,为什么还提示重复定义

[复制链接]
3307|12
 楼主| st316 发表于 2012-5-2 21:44 | 显示全部楼层 |阅读模式
假设有三个头文件,s1.c, s2.c和s3.c分别对应了三个头文件s1.h, s2.h, s3.h
这三个源文件分别 include 了三个对应的头文件。

现在,我希望在s1.c和s2.c里面使用在s3.h里面定义的变量,
于是,我在s1.c 与 s2.c 里面,把s3.h给 include 了进来。

另外,我在每个头文件里面都加了防止重复编译的。

#ifndef __S1_H__
#define __S1_H__

unsigned char s1;

#endif


可是Keil编译始终通不过,提示这个变量多次定义了。
我把原本在s3.h里面定义的变量,放在了 s3.c里面去定义,问题就解决了。

可是,为什么啊?
求解惑!
aozima 发表于 2012-5-2 21:59 | 显示全部楼层
先分清声明和定义,回炉重炼C语言吧。
 楼主| st316 发表于 2012-5-2 22:00 | 显示全部楼层
跟这帖子描述的问题一样,https://bbs.21ic.com/icview-53562-1-1.html

想问为什么加了条件编译,仍旧报错?
aozima 发表于 2012-5-2 22:16 | 显示全部楼层
#define  的作用域只限于单个文件。
airwill 发表于 2012-5-3 09:51 | 显示全部楼层
#define  的作用域只限于单个文件。
aozima 发表于 2012-5-2 22:16


这个说法欠妥了.
我感觉楼主的编程思路不清晰, 或者程序写法不规范导致的.
这没有什么复杂的问题, 真好借此机会, 好好规范一下自己的代码编写规则.
多看看人家的代码.
通常: 一个.c 对应一个 .h 文件
.h 文件只做申明, 不作定义
......
aozima 发表于 2012-5-3 10:11 | 显示全部楼层
本帖最后由 aozima 于 2012-5-3 10:17 编辑

应该没什么不妥,很多人以为
a.c里面include了s1.h。
  1. #ifndef __S1_H__
  2. #define __S1_H__

  3. unsigned char s1;

  4. #endif
而s1.h里面有
#define __S1_H__

所以
b.c里面再include s1.h就
#ifndef __S1_H__
不成立

事实上,#define __S1_H__在a.c编译完后就没了,b.c会继续 include

只有在a.c里面
重复

  1. #include <stdio.h>
  2. #include "s1.h"
  3. #include "s1.h"
  4. #include "s1.h"
这样子才有作用的。
LAORUAN 发表于 2012-5-3 11:16 | 显示全部楼层
要真这么纠结,还是得纠结头文件的排列顺序啊。

还是规范点写比较好,不用这么纠结。
kangwuwei 发表于 2012-5-3 14:36 | 显示全部楼层
为什么要在.h里面定义变量呢.在s3.h对应的.c文件中定义变量 然后在s3.h中用extern声明下
nongfuxu 发表于 2012-5-3 15:49 | 显示全部楼层
路过围观.
王紫豪 发表于 2012-5-3 16:18 | 显示全部楼层
.h 里不要有变量、函数的实体。
杜专 发表于 2012-5-3 21:46 | 显示全部楼层
你把所以变量都写在  main.h 或者.C把
airwill 发表于 2012-5-4 08:36 | 显示全部楼层
前面已经说过: 通常 一个.c 对应一个 .h 文件; .h 文件只做申明, 不作定义!

比如: 你的 S1.H 里做了下面的定义
unsigned char s1;

将导致什么问题呢?
如果一个工程里的两个源文件 S1.C 和 S2.C 都 #include "S1.H", 那么编译出现什么问题呢?
编译器认为:
    S1.C 定义了 unsigned char s1;
    S2.C 也定义了 unsigned char s1;

于是, 这个变量多次定义了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部