【问题标题】:What is the difference between undef and define <MACRO> 0?undef 和 define <MACRO> 0 有什么区别?
【发布时间】:2012-03-28 07:33:32
【问题描述】:

想了解undef和将宏定义为0的区别。谢谢。

【问题讨论】:

    标签: macros c-preprocessor


    【解决方案1】:
    #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 之后是不行的。
    【解决方案2】:

    定义为 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
    

    【讨论】:

      【解决方案3】:

      不同之处在于“未定义”与“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 将始终删除宏定义,使其未定义;出现次数将不再被替换。

      【讨论】:

        【解决方案4】:

        其中一个定义了宏,在某些情况下,出现的宏标识符将被预处理器替换为 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,可能会抛出未声明的错误,编译很可能会失败。

        【讨论】:

          【解决方案5】:

          在第一种情况下,符号不会被定义(#ifdef MACRO 不会'输入'),在第二种情况下,你将 MACRO 定义为'0'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-20
            • 2016-03-23
            • 2021-06-16
            • 2012-01-31
            • 2012-09-23
            相关资源
            最近更新 更多