宏定义与条件编译的疑惑。
原来搞硬件的,想转去做软件,最近学习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定义为标识,再用他去定义后面的语句,这有什么意义吗? re LZ:
如你所说:如果 C_Timer 未定义,则 Timer_ext 被定义成 extern。
但如果 C_Timer 有定义(不管定义成什么),那么 Timer_ext 将被定义成“空”。这就意味着下面的定义中的 Timer_ext 为“空”。 谢楼主
不过,既然这样,干嘛不用个VOID.?
#ifdef C_Timer
#define Timer_extvoid
#else
#define Timer_ext extern
#endif to 3L:
不能用“void”,这里只是文本上的“空”——即没有内容,而非 void 之意。如此类型将是:
unsigned intcur_ticks;
unsigned intb_times;
volatile bool Flag_timer;
否则将变成:
voidunsigned intcur_ticks;
voidunsigned intb_times;
voidvolatile bool Flag_timer;
这样自然不对。 就是编译器编译前把Timer_ext 替换成什么都没有:“”,
“Timer_extunsigned intcur_ticks;” 变成“unsigned intcur_ticks; ”
而不是变成“voidunsigned intcur_ticks; ” 受益不小啊,我以前搞硬件的,现在都30岁了,才想起还要搞嵌入式软件,雄关漫道真如铁啊。
页:
[1]