为了评估#if
条件,我的预处理器似乎假设未定义的常量为0 .
可以依赖它,还是未定义的常量给出未定义的行为?
我偶尔会编写类似这样的代码:
// file1.cpp
#define DO_THIS 1
#if DO_THIS
// stuff
#endif
Run Code Online (Sandbox Code Playgroud)
在代码开发期间,我可以切换DO_THIS
0到1之间的定义.
最近我不得不重新安排我的源代码并将一些代码从一个文件复制到另一个文件.但我发现我犯了一个错误,这两个部分已经分开了:
// file1.cpp
#define DO_THIS 1
Run Code Online (Sandbox Code Playgroud)
和
// file2.cpp
#if DO_THIS
// stuff
#endif
Run Code Online (Sandbox Code Playgroud)
显然我修正了错误,但后来想到了自己,为什么编译器没有警告我?我的警告级别设置为4. #if X
当X未定义时,为什么不可疑?
还有一个问题:如果我在其他地方犯了同样的错误,是否有任何系统的方法可以找出?这个项目很大.
编辑:我可以理解#ifdef没有任何警告是完全合理的.但肯定#if是不同的.
我在tracing.hh中有一组调试宏.它是否生成代码和输出是由真实源代码中的宏标志控制的:
// File: foo.cc
#define TRACING 0
#include "tracing.hh"
// Away we go . . .
TRACEF("debug message");
Run Code Online (Sandbox Code Playgroud)
标志TRACING应该有一个值; 我通常在0和1之间切换.
在tracing.h中,
#ifdef TRACING
会告诉我跟踪是定义的.#if TRACING
控制功能宏的定义 TRACEF()
但是如果TRACING没有价值呢?然后#if TRACING
产生一个错误:
In file included from foo.c:3:
tracing.hh:73:12: error: #if with no expression
Run Code Online (Sandbox Code Playgroud)
如何测试TRACING是否定义但没有价值?