我发现了一些类似于以下内容的遗留代码。说我有以下定义:
#define FOO(x) bar
x从未在定义中引用。那么,这是否意味着在FOO()中放置的任何文本都无关紧要?
我正在查看的代码散布着FOO(someValue);
之类的调用我假设预处理器只用bar
替换整个语句,无论someValue
是什么?有点x
存在的原因。
答案 0 :(得分:5)
是的,FOO(whatever)
已完全替换为您的示例中的bar
。
像这样的宏经常出现在" configure-able"代码,如:
#if defined(ENABLE_DEBUG_PRINT)
#define DEBUG_PRINT(msg) printf("Here's a message: %s\n", msg)
#else
#define DEBUG_PRINT(msg) /* empty */
#endif
答案 1 :(得分:4)
没有什么特别的事情发生。宏扩展时,宏定义中出现x
的任何内容都会扩展为相应参数的值。如果没有这种情况,则不会扩展(并且参数的实际值无关紧要)。
至于它为什么存在,可能是宏的一些过去或潜在的未来版本可能会使用该参数。也许它是采用单个参数的几个宏中的一个,并且它为了一致性而定义了这种方式。没有更多的背景,这是不可能的。但宏观定义完全有效。
答案 2 :(得分:2)
正是您认为会发生什么 - 价值被忽略。
我建议运行预处理器(gcc -E
或cpp
(可能为c ++添加-x c++
)以实际查看实现中实际发生的情况,而不仅仅是猜测。
答案 3 :(得分:2)
是的,宏FOO()
无论其参数如何都会扩展为bar
。这与函数可以忽略其部分或全部参数的性质没有区别。
宏可能是一个占位符,用于可能的未来实现,它确实使用了它的参数,或者替换了旧的实现。也可能是宏FOO()
的定义在不同的地方是不同的,并且一些定义使用它们的参数。如果它不是那些,也不是类似的,那么它只是混淆。
答案 4 :(得分:1)
那么,这是否意味着在FOO()中放置的任何文本都无关紧要?
除非有FOO()
的条件编译替代版本,其中实际使用x
。例如,您可能只计算调试版本中的表达式x
。
答案 5 :(得分:0)
此语句只使用x
表达式而不使用它。
例如,如果你想要存根某些方法,你可以使用它。