在#if指令之前强制宏定义

时间:2014-05-16 17:35:09

标签: c macros c-preprocessor conditional-compilation iar

我很惊讶地发现,在预处理器表达式中使用时,未定义的宏会自动赋值为0。例如:

//#define A
#if A == 0
// do something
#endif

此代码将在"做某事"部分,虽然我预计它会给出一个错误。我发现GCC有option to warn against this case

  
      
  • 不是宏的标识符,它们都被认为是数字零。如果您知道#if MACRO在定义时始终具有非零值,则允许您编写#ifdef MACRO而不是MACRO。没有函数调用括号的函数式宏也被视为零。

         

    在某些情况下,这种捷径是不可取的。 -Wundef选项会导致GCC在遇到#if中不是宏的标识符时发出警告。

  •   

因此,我正在为 IAR Embedded Workbench IDE 寻找-Wundef的等效选项。有这样的选择吗?

2 个答案:

答案 0 :(得分:2)

IAR Embedded Workbench中的IAR C / C ++编译器可以检测到这一点。但是,默认情况下,它被配置为注释,但未显示。

您可以使用命令行选项--remarks,也可以使用--diag_warning=Pe193--diag_error=Pe193将严重性提升为警告或错误。

答案 1 :(得分:1)

你说cpp -WUndef检查在构建时是不切实际的。假设您的代码处于SCM控制之下,那么他们也会花时间使用最早的质量控制回购。您可以为此检查添加commit-hook或扩展现有检查。

如果这对您来说是一项创新,请考虑其他代码质量 检查以这种方式自动化会很好。