【问题标题】:How does #define know when to stop looking?#define 如何知道何时停止查找?
【发布时间】:2020-04-30 13:50:30
【问题描述】:

我在 C++ 中使用宏来切换是否编译日志记录:

#define MAYBE_LOG(msg) 
#ifdef PRINT_MSGS 
ALWAYS_LOG(msg) 
#endif

#define 怎么知道结尾在哪里? #endif 指的是#ifdef,而不是#define

【问题讨论】:

  • 假设意图是定义一个三行宏,这里有两个问题:首先你需要在每行的末尾加上反斜杠,但最后一行;其次,宏内部不允许使用预处理器指令。

标签: c++ preprocessor preprocessor-directive


【解决方案1】:

#define 结束于行尾(可以用 final \ 扩展)

【讨论】:

  • 所以我的代码是错误的,我需要在除最后一行之外的每一行都使用“\”?
  • 您不能在#define 中进行#ifdef 预处理。
【解决方案2】:

问题中的代码做了两件事:它定义了一个名为 MAYBE_LOG 的宏,没有正文,如果定义了 PRINT_MSGS,它使用一个名为 ALWAYS_LOG 的宏。如果这不是它应该做的,那么,是的,它需要改变。由于问题没有说明代码应该做什么,这只是一个猜测:

#ifdef PRINT_MSGS
#define MAYBE_LOG(msg) ALWAYS_LOG(msg)
#else
#define MAYBE_LOG(msg)
#endif

这样做的原因(而不是在每一行上使用\ 来扩展宏定义是因为您不能将#if 条件放在宏的定义中。

【讨论】:

  • 这可能是一个解决方案。但是,如果 OP 计划通过在源代码中的各个点重新定义 PRINT_MSGS 来启用和禁用日志记录,则它将不起作用。
  • @TonyK -- 如果添加了当前未指定的要求,许多事情将无法工作。正如我所说,由于问题没有说明代码应该做什么,所以任何人都可以做的就是猜测。或者保持沉默。
  • 是的,当然。我只是在为 OP 澄清一些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2011-12-03
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多