【问题标题】:Preventing Undefined Macro防止未定义的宏
【发布时间】:2014-08-19 08:54:20
【问题描述】:

在 C 和 C++ 中,当使用这样的宏时:

#if ( 1 == __MY_MACRO__ )
// Some code
#endif

如果 MY_MACRO 未定义,编译器将不会捕获并将其视为 0。当设计代码时,这可能会导致许多隐藏的错误,因此必须定义宏(非零)。

即使编译器本机不寻找这样的东西,是否可以让编译器报告这一点?

【问题讨论】:

  • "如果 MY_MACRO 未定义,编译器将不会捕获并将其视为 0" 这不是真的。如果MY_MACRO未定义,编译器会报错。
  • 它不会报告错误,基于我测试过的几个编译器,包括 Visual Studio 2013。
  • @nos 是的,我错了,现在我看到它在#if 内。 C++ 标准规定所有未定义的标识符都替换为0

标签: c++ c macros c-preprocessor


【解决方案1】:

使用#if defined(__MY_MACRO__) 测试是否定义了宏值。

【讨论】:

  • #ifdef#ifndef 取决于您是否要捕获它被定义或未定义。
  • +1,但它不是函数。 :) 换句话说,#if defined __MY__MACRO 也同样有效。
  • @unwind - 非常正确,出于某种原因,我只是喜欢看起来像函数的东西!感谢您的支持。
【解决方案2】:
#ifndef __MY_MACRO__
  #error "MY_MACRO NOT DEFINED"
#endif

【讨论】:

    【解决方案3】:

    您可以使用#ifdefifndef 来检查是否定义了宏。

    例子:

    #ifndef MY_MACRO
    # error "MY_MACRO is not defined"
    #endif
    

    更多信息可以在这里找到:https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html

    【讨论】:

    • 如果不是,我不会尝试定义宏。我想确保检查是有效的,并且宏必须是预定义的。
    【解决方案4】:

    我不得不求助

    #if !defined( __MY_MACRO__ )
    MACRO_NOT_DEFINED;  //to cause compiler error
    #endif
    #if ( 1 == __MY_MACRO__ )
    //code
    #endif
    

    看起来很丑。

    【讨论】:

    • 是的,但是有些编译器无法识别#error,很遗憾。谢谢。
    • "是的,但是某些编译器无法识别#erro" - 他们对此做了什么?打印错误对吗?因此,无论如何,不​​妨使用#error - 无论打印出什么消息,它都可以帮助查看错误行的人理解您的意图。另外,您可以将#endif 和以下#if (1 == ... 组合成#elif (1 == ... 并保存一行。而且您不应该使用双下划线 - 这是为实现保留的。
    • 标准(所有版本)要求#error停止编译。
    【解决方案5】:

    我认识的人想出了一个聪明的 1 班轮

    #if ( (1/defined(_MY_MACRO__) && 1 == _MY_MACRO__ ) )
    //code
    #endif
    

    如果_MY_MACRO__没有定义,会导致被零除错误。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2019-05-07
      相关资源
      最近更新 更多