我很惊讶地发现,在预处理器表达式中使用时,未定义的宏会自动赋值为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
的等效选项。有这样的选择吗?
答案 0 :(得分:2)
IAR Embedded Workbench中的IAR C / C ++编译器可以检测到这一点。但是,默认情况下,它被配置为注释,但未显示。
您可以使用命令行选项--remarks
,也可以使用--diag_warning=Pe193
或--diag_error=Pe193
将严重性提升为警告或错误。
答案 1 :(得分:1)
你说cpp -WUndef
检查在构建时是不切实际的。假设您的代码处于SCM控制之下,那么他们也会花时间使用最早的质量控制回购。您可以为此检查添加commit-hook或扩展现有检查。
如果这对您来说是一项创新,请考虑其他代码质量 检查以这种方式自动化会很好。