关于条件编译#ifdef endif的疑问

[复制链接]
1201|6
 楼主| XLDZZ 发表于 2017-3-29 15:00 | 显示全部楼层 |阅读模式
菜鸟有个疑问 还请各位大神看看问题是这样的

    我在key.h中定义了一个结构体变量
    typedef struct
     {
       u8 key_cnt;
      u8 key_flag;
     }key_t;

   然后在 main.c key.c test.c中包含这个文件 在不同的c文件里创建不同的变量
   编译器报警,提示多重定义.
   于是在key.h中加入条件编译
   #ifdef key
   #define key
      typedef struct
     {
       u8 key_cnt;
      u8 key_flag;
     }key_t;
  #endif
这样就解决问题了

我的问题是 main key c等文件包含了key.h文件后,按照编译原理首先要把key.h中的文件
打开后放置在各个c文件里,这样不就是各个c文件里多有
   #ifdef key
   #define key
      typedef struct
     {
       u8 key_cnt;
      u8 key_flag;
     }key_t;
  #endif

这个内容 那不是又多重定义了吗 怎么会又解决了呢
那么 条件编译到底是什么作用呢
5992230 发表于 2017-3-29 15:24 | 显示全部楼层
key 在哪里定义的?
nethopper 发表于 2017-3-29 17:09 | 显示全部楼层
在H文件中用:
typedef struct key_t
{
       u8 key_cnt;
       u8 key_flag;
} key_t


这样,在各C文件中用以下两法之一来定义变量应该都行:
struct key_t  key_t1, key_t2, key_t3;

key_t key_t1, key_t2, key_t3;
zyj9490 发表于 2017-3-29 20:20 | 显示全部楼层
第一个文件时,产生一个KEY的宏定义,并且产生KEY_T这个数据类型 ,再碰到.H时,此时已有KEY,不会再条件编译的部分。也就是不会再产生变量及数据类型。不明白编译过程导致的。
@若水 发表于 2017-3-30 11:06 | 显示全部楼层
#ifndef key
   #define key
      typedef struct
     {
       u8 key_cnt;
      u8 key_flag;
     }key_t;
  #endif
@若水 发表于 2017-3-30 11:06 | 显示全部楼层
看5楼,你打的是不是少了个n?
 楼主| XLDZZ 发表于 2017-5-22 15:27 | 显示全部楼层
感谢各位 的确是使用#ifndef 这样才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

182

帖子

0

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