我正在尝试使用宏来根据宏的参数定义几个类似的函数。但是,结果函数需要采用的参数的数量和类型在所有函数中都不相同,但我还需要将函数的所有参数传递给函数体内的另一个可变参数函数。
我想要完成的一个最小例子:
#define COMMAND(__COMMAND__, __FORMAT__, ...) \
void __COMMAND__ ( __VA_ARGS__ ) { \
printf( __FORMAT__, ##__VA_ARGS__ ); \
}
COMMAND( Start, "m start %c\r", (char) unit )
COMMAND( Home, "m home\r" )
COMMAND( Add_To_Chart, "cv 0 %d %d\r", (int) ch1, (int) ch2 )
// literally hundreds of additional COMMANDs needed here.
(注意,函数的实际逻辑要复杂得多。)
但是,我无法弄清楚在函数定义和函数调用中作为参数列表有效的语法。
使用表单(type)arg
不是函数定义的有效语法,但我可以将它传递给printf
就好了(它被视为强制转换)。
COMMAND( A, "cv 0 %d %d\r", (int)ch1, (int)ch2 )
// error: expected declaration specifiers or ‘...’ before ‘(’ token
// void A ( (int)ch1, (int)ch2 ) {
// printf( "cv 0 %d %d\r", (int)ch1, (int)ch2 );
// }
另一方面,type(arg), appears to work for the function declaration, but function-style casts are only available in C++, not C, so it fails on
printf`。
COMMAND( B, "cv 0 %d %d\r", int(ch1), int(ch2) )
// error: expected expression before ‘int’
// void B ( int(ch1), int(ch2) ) {
// printf( "cv 0 %d %d\r", int(ch1), int(ch2) );
// }
如何将variadic宏参数用作函数的参数定义和作为传递给另一个函数的参数?