测试空宏定义

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值视为更有意义.做正确事情的唯一标记是布尔文字truefalse.


Jea*_*bre 5

聚会迟到了,但我发现了一个很好的技巧来区分

#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第一次测试通过。

这当然不适用于字符串文字。


Mat*_*nen 0

#if defined(TRACING) && !TRACING
Run Code Online (Sandbox Code Playgroud)

做这件事吗?

  • 不幸的是,这行不通。您将遇到同样的问题,其中 TRACING 将被删除。你最终会得到类似这样的结果:“#if Defined(TRACING) && !”。因此,“错误:运算符'!' 没有正确的操作数”将在构建时引发。 (6认同)