#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 如何知道何时停止查找?的主要内容,如果未能解决你的问题,请参考以下文章