undef和define <macro> 0之间有什么区别?</macro>

时间:2012-03-28 07:33:32

标签: macros c-preprocessor

想要了解undef之间的区别并将宏定义为0.谢谢。

5 个答案:

答案 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'