gpt4 book ai didi

preprocessor - 测试空宏定义

转载 作者:行者123 更新时间:2023-12-03 11:54:12 28 4
gpt4 key购买 nike

在tracing.hh中,我有一组调试宏。它是否生成代码和输出由实际源代码中的宏标志控制:

// File:  foo.cc
#define TRACING 0
#include "tracing.hh"
// Away we go . . .
TRACEF("debug message");

标志TRACING应该有一个值;我通常在0和1之间切换。

在tracing.h中,
  • #ifdef TRACING会告诉我已定义了跟踪。
  • #if TRACING控制诸如TRACEF()
  • 之类的功能宏的定义

    但是,如果TRACING没有值(value)怎么办?然后 #if TRACING产生一个错误:
    In file included from foo.c:3:
    tracing.hh:73:12: error: #if with no expression

    如何测试TRACING是否已定义但没有值(value)?

    最佳答案

    有了Matti的建议和更多建议,我认为问题是这样的:如果TRACING没有值,我们需要在测试#if ...中使用有效的预处理器表达式。 Gnu cpp manual
    表示必须计算为整数表达式,因此即使缺少一个参数,我们也需要一个有效的表达式。我最后遇到的是:

    #if (TRACING + 0)
    # . . .
  • 如果TRACING具有数值(如#define TRACING 2 \n)中一样,cpp具有有效表达式,并且我们没有更改该值。
  • 如果TRACING没有值(如#define TRACING \n),则预处理器将#if (+0)评估为false

  • 无法处理的唯一情况是
  • 如果TRACING具有非数字值(即ON)。 cpp手册说“不是宏的标识符……都被视为数字零”,其结果为false。但是,在这种情况下,将其视为true值会更有意义。唯一做正确的事情是 bool(boolean) 文字truefalse
  • 关于preprocessor - 测试空宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102351/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com