【发布时间】:2012-03-28 07:33:32
【问题描述】:
想了解undef和将宏定义为0的区别。谢谢。
【问题讨论】:
标签: macros c-preprocessor
想了解undef和将宏定义为0的区别。谢谢。
【问题讨论】:
标签: macros c-preprocessor
#define MACRO 0
将预处理器标记 MACRO 定义为文字 0
#undef MACRO
删除预处理器令牌MACRO 的定义,使其仿佛从未存在过。
例如:
#define MACRO 0
#if defined ( MACRO )
// we get here
#endif
#if ( MACRO )
// we don't get here
#endif
#undef MACRO
#if defined ( MACRO )
// we don't get here
#endif
【讨论】:
#define MACRO 1 紧跟在#undef MACRO 之后是可以的,而#define MACRO 1 紧跟在#define MACRO 0 之后是不行的。
定义为 0 的宏仍被定义。
#define VAL 0
#ifdef VAL
// VAL is defined so this part will be entered
printf("%d", VAL); // <- prints "0"
#endif
#undef VAL
#ifdef VAL
// Val is now undefined, this part will not be entered
#endif
【讨论】:
不同之处在于“未定义”与“0”不同(取决于您的用法)。
在布尔上下文中使用,例如#if MY_MACRO,没有区别(因为undefined翻译成false)。
但是,一旦您检查要定义的某个宏,就会有所不同:
// this macro is defined but empty.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be deleted, e.g. 'something = MY_MACRO;' would be changed to 'something = ;'
#define MY_MACRO
// this macro is defined and set to 0.
// #ifdef MY_MACRO would evaluate to true/be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would be replaced, e.g. 'something = MY_MACRO;' would be changed to 'something = 0;'
#define MY_MACRO 0
// this macro is undefined (after these lines)
// #ifdef MY_MACRO would evaluate to false/not be included
// #if MY_MACRO would evaluate to false/not be included
// occurances would remain unchanged (as the macro isn't defined anymore), e.g. 'something = MY_MACRO;' would be kept as 'something = MY_MACRO;'
#define MY_MACRO Hello!
#undef MY_MACRO
一般来说:
#define 总是分配一些值并定义宏;即使新值为“空”。
#undef 将始终删除宏定义,使其未定义;出现次数将不再被替换。
【讨论】:
其中一个定义了宏,在某些情况下,出现的宏标识符将被预处理器替换为 0。另一个删除宏的任何定义,这样如果在相同的上下文中找到标识符,预处理器不会用任何东西替换它,而是保持原样。
例如,预处理器会变成这样:
#define MACRO 0
int main()
{
return MACRO;
}
进入这个:
int main()
{
return 0;
}
但是,它会变成这样:
#define MACRO 0
#undef MACRO
int main()
{
return MACRO;
}
进入这个:
int main()
{
return MACRO;
}
在第二个例子中,C编译器会遇到标识符MACRO,可能会抛出未声明的错误,编译很可能会失败。
【讨论】:
在第一种情况下,符号不会被定义(#ifdef MACRO 不会'输入'),在第二种情况下,你将 MACRO 定义为'0'
【讨论】: