打印

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

[复制链接]
2359|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  的作用域只限于单个文件。

使用特权

评论回复
5
airwill| | 2012-5-3 09:51 | 只看该作者
#define  的作用域只限于单个文件。
aozima 发表于 2012-5-2 22:16


这个说法欠妥了.
我感觉楼主的编程思路不清晰, 或者程序写法不规范导致的.
这没有什么复杂的问题, 真好借此机会, 好好规范一下自己的代码编写规则.
多看看人家的代码.
通常: 一个.c 对应一个 .h 文件
.h 文件只做申明, 不作定义
......

使用特权

评论回复
6
aozima| | 2012-5-3 10:11 | 只看该作者
本帖最后由 aozima 于 2012-5-3 10:17 编辑

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

unsigned char s1;

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

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

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

只有在a.c里面
重复

#include <stdio.h>
#include "s1.h"
#include "s1.h"
#include "s1.h"
这样子才有作用的。

使用特权

评论回复
7
LAORUAN| | 2012-5-3 11:16 | 只看该作者
要真这么纠结,还是得纠结头文件的排列顺序啊。

还是规范点写比较好,不用这么纠结。

使用特权

评论回复
8
kangwuwei| | 2012-5-3 14:36 | 只看该作者
为什么要在.h里面定义变量呢.在s3.h对应的.c文件中定义变量 然后在s3.h中用extern声明下

使用特权

评论回复
9
nongfuxu| | 2012-5-3 15:49 | 只看该作者
路过围观.

使用特权

评论回复
10
王紫豪| | 2012-5-3 16:18 | 只看该作者
.h 里不要有变量、函数的实体。

使用特权

评论回复
11
杜专| | 2012-5-3 21:46 | 只看该作者
你把所以变量都写在  main.h 或者.C把

使用特权

评论回复
12
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

粉丝