通过宏传递宏参数
Passing macro arguments by macro
我正在尝试将 RGB 颜色传递到采用三个参数的宏中。
一个正常的调用看起来像这样:MACRO(255, 255, 255)
宏转换参数并与运算符一起通过 SPI 发送到图形控制器。 C 代码中的调用如下所示:cmd(MACRO(0,0,0));
由于颜色在多种场合使用,但可能会发生变化,我认为通过另一个宏定义它可能是个好主意。
所以定义一种颜色,例如#define BLACK 0,0,0
并将其插入到另一个宏中应该没问题:MACRO( BLACK )
-> cmd(MACRO( BLACK ));
但是编译器输出错误:
macro "MACRO" requires 3 arguments, but only 1 given
得到这个我假设提供参数的宏没有被扩展。我试图通过阅读 gcc 宏文档找出问题所在,但无法解决。我认为这是那些愚蠢的简单事情之一......
谢谢!
更多信息:
驱动程序提供了多个宏,将三个数字 (rgb) 作为参数。我想定义一个配色方案,以便能够在不改变超过这三个数字的情况下为每次出现更改颜色。
插入宏的函数采用无符号长整数,这就是宏生成的内容。
为什么不简单地用 0,0,0 替换术语 BLACK?
引自 gcc 宏文档:
"All arguments to a macro are completely macro-expanded before they are substituted into the macro body. After substitution, the complete text is scanned again for macros to expand, including the arguments."
您可能想像这样定义您的宏:
#define MACRO(x, y, z) somestuffhere
#define BLACK MACRO(0,0,0)
然后这样称呼它
cmd(BLACK);
这是一个更符合逻辑的实现。如果你定义一个带 3 个参数的宏,它应该带 3 个参数而不是一个。但是,您可以在另一个宏定义中调用宏。
您必须确保您的组合 MACRO(BLACK)
再次评估 BLACK
部分。否则它不会 "see" 分隔零的逗号。你可以做的是将现有的 MACRO
重命名为 MACRO3
(它接收 3 个参数)然后
#define MACRO(...) MACRO3(__VA_ARGS__)
我正在尝试将 RGB 颜色传递到采用三个参数的宏中。
一个正常的调用看起来像这样:MACRO(255, 255, 255)
宏转换参数并与运算符一起通过 SPI 发送到图形控制器。 C 代码中的调用如下所示:cmd(MACRO(0,0,0));
由于颜色在多种场合使用,但可能会发生变化,我认为通过另一个宏定义它可能是个好主意。
所以定义一种颜色,例如#define BLACK 0,0,0
并将其插入到另一个宏中应该没问题:MACRO( BLACK )
-> cmd(MACRO( BLACK ));
但是编译器输出错误:
macro "MACRO" requires 3 arguments, but only 1 given
得到这个我假设提供参数的宏没有被扩展。我试图通过阅读 gcc 宏文档找出问题所在,但无法解决。我认为这是那些愚蠢的简单事情之一...... 谢谢!
更多信息: 驱动程序提供了多个宏,将三个数字 (rgb) 作为参数。我想定义一个配色方案,以便能够在不改变超过这三个数字的情况下为每次出现更改颜色。
插入宏的函数采用无符号长整数,这就是宏生成的内容。
为什么不简单地用 0,0,0 替换术语 BLACK?
引自 gcc 宏文档:
"All arguments to a macro are completely macro-expanded before they are substituted into the macro body. After substitution, the complete text is scanned again for macros to expand, including the arguments."
您可能想像这样定义您的宏:
#define MACRO(x, y, z) somestuffhere
#define BLACK MACRO(0,0,0)
然后这样称呼它
cmd(BLACK);
这是一个更符合逻辑的实现。如果你定义一个带 3 个参数的宏,它应该带 3 个参数而不是一个。但是,您可以在另一个宏定义中调用宏。
您必须确保您的组合 MACRO(BLACK)
再次评估 BLACK
部分。否则它不会 "see" 分隔零的逗号。你可以做的是将现有的 MACRO
重命名为 MACRO3
(它接收 3 个参数)然后
#define MACRO(...) MACRO3(__VA_ARGS__)