想要了解undef之间的区别并将宏定义为0.谢谢。
答案 0 :(得分:7)
#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
答案 1 :(得分:3)
仍定义了定义为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
答案 2 :(得分:2)
区别在于“未定义”与“0”不同(取决于您的用法)。
在布尔上下文中使用,例如#if MY_MACRO
,没有区别(因为未定义翻译为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
将始终删除宏定义,使其未定义;出现将不再被替换。
答案 3 :(得分:1)
其中一个以这样的方式定义宏:在某些上下文中,预处理器将宏标识符的出现替换为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
,并且可能抛出一个未声明的错误,编译可能会失败。
答案 4 :(得分:1)
在第一种情况下,不会定义符号(#ifdef MACRO不会'输入'),在第二种情况下,您将MACRO定义为'0'