【发布时间】:2020-04-11 13:31:06
【问题描述】:
给定以下根据 C99 标准编写的代码:
#define LOW 1
#define MEDIUM 2
#define HIGH 3
#define LOGGING_LEVEL HIGH
#if LOGGING_LEVEL >= MEDIUM
#define LOG_MEDIUM(message) printf(message)
#else
#define LOG_MEDIUM(message) ((void)0)
#endif
void load_configuration() {
//...
LOG_MEDIUM("Configuration loaded\n");
}
((void)0) 的目的是什么,我在网上搜索了很多,但没有找到任何相关信息。
另外,为什么我们在使用printf(message) 之后不写;
【问题讨论】:
-
那是没有操作。
-
它只是创建了一个空值结果。
0只是一个虚拟值,因为转换需要应用于表达式。 void 强制转换丢弃该值。您可以将整个事物视为一个 void 值的常量表达式。 -
@TomKarzes 好的,但为什么我们首先需要一个空值常量表达式?
-
另外,他们将分号
;留在宏之外的原因是用户可以添加它。否则,如果他们有分号并且用户添加了第二个,它将成为一系列语句并且可能是语法问题,例如if (c) MACRO; else x;将扩展为if (c) expr;; else x;,这将是由于双分号;;而导致的语法错误。 -
@Chris1998ch 哦,我认为 Thomas Dickey 对
void演员阵容有一个很好的解释。将其设为无效值可避免对无效语句的警告。我确定这就是他们使用((void) 0)而不仅仅是(0)的原因。