pdb*_*dbj 21 preprocessor c-preprocessor
我在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是否定义但没有价值?
pdb*_*dbj 25
有了Matti的建议和一些更多的讨论,我认为问题是:如果TRACING没有值,我们需要在测试中使用有效的预处理器表达式#if ....该牛羚CPP手册
说,它必须评估为整数表达式,所以我们需要一个甚至如果参数之一是缺少有效的表达.我最终遇到的是:
#if (TRACING + 0)
# . . .
Run Code Online (Sandbox Code Playgroud)
TRACING有一个数值(如#define TRACING 2 \n),cpp有一个有效的表达式,我们没有更改该值. TRACING没有值(如#define TRACING \n),则预处理器求#if (+0)值为false唯一没有处理的情况是
TRACING有一个标记值(即,ON).cpp手册说" 不是宏的标识符 ...... 都被认为是数字零 ",其评估结果为false.但是,在这种情况下,将这个true值视为更有意义.做正确事情的唯一标记是布尔文字true和false.聚会迟到了,但我发现了一个很好的技巧来区分
#define TRACING 0
Run Code Online (Sandbox Code Playgroud)
从
#define DTRACING
Run Code Online (Sandbox Code Playgroud)
像这样:
#if (0-TRACING-1)==1 && (TRACING+0)!=-2
#error "tracing empty"
#endif
Run Code Online (Sandbox Code Playgroud)
如果TRACING为空,则表达式的计算结果为0--1=> 1。
如果TRACING是 0,则表达式计算为0-0-1=>-1
我添加了一个额外的检查,以防TRACING==-2第一次测试通过。
这当然不适用于字符串文字。
会
#if defined(TRACING) && !TRACING
Run Code Online (Sandbox Code Playgroud)
做这件事吗?