#define 如何知道何时停止查找?

Posted

技术标签:

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

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

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

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

【问题讨论】:

假设意图是定义一个三行宏,这里有两个问题:首先你需要在每行的末尾加上反斜杠,但最后一行;其次,宏内部不允许使用预处理器指令。 【参考方案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 澄清一些事情。

以上是关于#define 如何知道何时停止查找?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道何时停止定位服务?

JavaScript 中的反向 while 循环如何知道何时停止?

Java:生产者=消费者,如何知道何时停止?

检测窗口何时停止移动?

CoreBluetooth 知道广告何时停止

Azure 触发的 Webjob - 检测 webjob 何时停止