通过宏传递宏参数

时间:2015-12-18 13:31:18

标签: c gcc macros

我正在尝试将RGB颜色传递到带有三个参数的宏中。 普通电话会是这样的:MACRO(255, 255, 255) 宏转换参数并与操作符一起,然后通过SPI将其发送到图形控制器。 C代码中的调用如下所示:cmd(MACRO(0,0,0));

由于颜色在多个场合使用,但可能会有变化,我认为通过另一个宏定义它可能是个好主意。 所以定义颜色,例如#define BLACK 0,0,0并将其插入另一个宏应该没问题:MACRO( BLACK ) - > cmd(MACRO( BLACK )); 但编译器输出错误:

  

宏“MACRO”需要3个参数,但只有1个

得到这个我假设提供参数的宏没有被扩展。我试图找出通过gcc宏文档读取的错误,但无法单独使用它。我认为这是一个愚蠢的简单事情...... 谢谢!

更多信息: 驱动程序提供了多个宏,它们将三个数字(rgb)作为参数。我想定义一个颜色方案,以便能够在不改变这三个数字的情况下更改每次出现的颜色。

插入宏的函数采用无符号长整数,这就是宏生成的函数。

为什么BLACK这个术语不能简单地用0,0,0代替?

来自gcc宏文档的引用:

  

“宏的所有参数在被替换为宏体之前都是完全宏扩展的。替换之后,再次扫描完整的文本以扩展宏,包括参数。”

2 个答案:

答案 0 :(得分:3)

您必须确保您的组合MACRO(BLACK)再次评估BLACK部分。否则它不会“看到”分隔零的逗号。您可以将现有的MACRO重命名为MACRO3(它接收3个参数),然后

#define MACRO(...) MACRO3(__VA_ARGS__)

答案 1 :(得分:2)

您可能希望像这样定义宏:

'https://www.googleapis.com/youtube/v3/search?part=snippet&q=' + query + '&key={My_key}'

然后像那样称呼它

#define MACRO(x, y, z) somestuffhere
#define BLACK MACRO(0,0,0)

这是一个更合乎逻辑的实现。如果定义一个带有3个参数的宏,则应该使用3个参数而不是1个参数。但是,您可以在另一个宏定义中调用宏。