有没有一种方法可以将多个值作为C中定义的单个宏值传递给宏函数?

有没有一种方法可以将多个值作为C中定义的单个宏值传递给宏函数?,c,gcc,macros,avr,C,Gcc,Macros,Avr,我想在全局标头中将pin定义声明为一个简单的行,如: #定义状态_LEDB,7 然后我想将此pin定义传递给上面的函数: CMBU设置(状态指示灯); 我不知道如何处理这个问题-我的PIN格式正确,可以在预编译阶段替换 #定义CMBsbi(端口,pin)(端口###端口)|=(1这是可能的,但您需要另一个级别的宏来扩展参数: #define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin) #define CMBset_out(x) C

我想在全局标头中将pin定义声明为一个简单的行,如:

#定义状态_LEDB,7
然后我想将此pin定义传递给上面的函数:

CMBU设置(状态指示灯);
我不知道如何处理这个问题-我的PIN格式正确,可以在预编译阶段替换

#定义CMBsbi(端口,pin)(端口###端口)|=(1这是可能的,但您需要另一个级别的宏来扩展参数:

#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(x) CMBset_out_X(x)

#define CMBset_out_X(port,pin)(DDR##port)|=(1是对前面答案的改进,它还允许您使用两个显式参数调用宏

它应与任何c99(或更好)编译器配合使用:

#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(...) CMBset_out_X(__VA_ARGS__)

#define STATUS_LED B,7
CMBset_out(STATUS_LED)
CMBset_out(B, 7)

#定义CMBset_out_X(端口、pin)(DDR##端口)|=(1@mosvy,你能详细说明一下吗?这个构造是如何工作的?你能解释一下它到底是如何工作的吗?为什么我需要两级宏,而它似乎什么都不做?@bajtec:因为预处理器在过程中运行;第一个过程将
CMBset\u out(状态指示灯)
替换为
CMBset\u\X(B,7)
,然后第二遍替换
CMBset\u out\u X
宏。@bajtec基本上,类似宏的函数的参数在宏的“替换列表”(右侧)中按原样替换(不展开宏),然后递归扫描结果以查找其他宏。这些参数是“惰性计算”的例如,它们是在传递给宏之前展开的,而不是在传递给宏之前展开的。如果这不是最好的解释,那么很抱歉;-)几乎……”类似于宏的函数的参数将按原样替换(不进行宏展开)…如果替换列表中的参数正在粘贴/字符串化。例如,在此CMBset_中,
\VA____________
两者都不是,
状态指示灯
被展开(6.10.3.1),在结果重新扫描之前产生
B,7
,这就是使此解决方案工作的原因(如果没有这一点,您将拥有
CMBset___X(状态指示灯)
正在重新扫描,我们已经知道这不起作用!)@HWalters你说得对,我跳过了一步。但基本是正确的——参数在传递给宏后仍然会展开——否则在替换列表中粘贴/字符串化时放弃展开它们就太晚了。
#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(x) CMBset_out_X(x)
#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(...) CMBset_out_X(__VA_ARGS__)

#define STATUS_LED B,7
CMBset_out(STATUS_LED)
CMBset_out(B, 7)