#define FOO(x)bar,x从未在定义中引用,会发生什么?

时间:2016-08-22 20:20:49

标签: c-preprocessor

我发现了一些类似于以下内容的遗留代码。说我有以下定义:

#define FOO(x) bar

x从未在定义中引用。那么,这是否意味着在FOO()中放置的任何文本都无关紧要?

我正在查看的代码散布着FOO(someValue);之类的调用我假设预处理器只用bar替换整个语句,无论someValue是什么?有点x存在的原因。

6 个答案:

答案 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 -Ecpp(可能为c ++添加-x c++)以实际查看实现中实际发生的情况,而不仅仅是猜测。

答案 3 :(得分:2)

是的,宏FOO()无论其参数如何都会扩展为bar。这与函数可以忽略其部分或全部参数的性质没有区别。

宏可能是一个占位符,用于可能的未来实现,它确实使用了它的参数,或者替换了旧的实现。也可能是宏FOO()的定义在不同的地方是不同的,并且一些定义使用它们的参数。如果它不是那些,也不是类似的,那么它只是混淆。

答案 4 :(得分:1)

  

那么,这是否意味着在FOO()中放置的任何文本都无关紧要?

除非有FOO()的条件编译替代版本,其中实际使用x。例如,您可能只计算调试版本中的表达式x

答案 5 :(得分:0)

此语句只使用x表达式而不使用它。

例如,如果你想要存根某些方法,你可以使用它。