lyf9908 发表于 2011-1-3 21:08

宏定义与条件编译的疑惑。

原来搞硬件的,想转去做软件,最近学习C语言,有很多问题,如比下面的一段代码:

#ifdef C_Timer
#define Timer_ext   
#else
#define Timer_ext    extern
#endif

Timer_extunsigned intcur_ticks;
Timer_extunsigned intb_times;
Timer_extvolatile bool   Flag_timer;

如果C_Timer没有定义过,则Timer_ext的意思就是extern,则接下来的语句都定义为外部变量。
   但如果C_Timer有定义过,则把Timer_ext定义为标识,再用他去定义后面的语句,这有什么意义吗?

HWM 发表于 2011-1-4 08:34

re LZ:

如你所说:如果 C_Timer 未定义,则 Timer_ext 被定义成 extern。
但如果 C_Timer 有定义(不管定义成什么),那么 Timer_ext 将被定义成“空”。这就意味着下面的定义中的 Timer_ext 为“空”。

lyf9908 发表于 2011-1-4 16:13

谢楼主
    不过,既然这样,干嘛不用个VOID.?
   #ifdef C_Timer
#define Timer_extvoid
#else
#define Timer_ext    extern
#endif

HWM 发表于 2011-1-4 19:30

to 3L:

不能用“void”,这里只是文本上的“空”——即没有内容,而非 void 之意。如此类型将是:

unsigned intcur_ticks;
unsigned intb_times;
volatile bool   Flag_timer;

否则将变成:

voidunsigned intcur_ticks;
voidunsigned intb_times;
voidvolatile bool   Flag_timer;

这样自然不对。

xwj 发表于 2011-1-4 19:34

就是编译器编译前把Timer_ext 替换成什么都没有:“”,
“Timer_extunsigned intcur_ticks;”    变成“unsigned intcur_ticks; ”
而不是变成“voidunsigned intcur_ticks; ”

lyf9908 发表于 2011-1-6 20:30

受益不小啊,我以前搞硬件的,现在都30岁了,才想起还要搞嵌入式软件,雄关漫道真如铁啊。
页: [1]
查看完整版本: 宏定义与条件编译的疑惑。