通用的解决方法是什么
警告:ISO C ++ 11在可变参数宏中至少需要一个用于“ ...”的参数
由-pedantic
标志为gcc引入的警告?
考虑以下示例
#define FUNCTION_DECL(ret, name, ...) ret name(__VA_ARGS__)
FUNCTION_DECL(int, foo, int bar, int quax)
{
return bar + quax;
}
FUNCTION_DECL(void, no_args)
{
}
上面的no_args
宏produces错误的扩展。
解决方案的示例是具有两个宏,然后简单的overload trick
#define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, NAME, ...) NAME
#define METHOD_DECL2(ret, name) ret name()
#define METHOD_DECL3(ret, name, ...) ret name(__VA_ARGS__)
#define METHOD_DECL(...) GET_MACRO(__VA_ARGS__, METHOD_DECL3, METHOD_DECL3, METHOD_DECL3, METHOD_DECL3, METHOD_DECL3, METHOD_DECL3, METHOD_DECL3, METHOD_DECL2)(__VA_ARGS__)
然后METHOD_DECL(void, no_args)
不再触发错误。
遗憾的是,它在MSVC2017中不起作用,但已在MSVC2019的最新预览版中修复。
这个解决方案有点笨拙。我试图考虑不同的解决方案,例如
#define EXTRACT_FIRST(_1, ...) _1
#define OMIT_FIRST(_1, ...) __VA_ARGS__
#define METHOD_DECL(ret, ...) ret EXTRACT_FIRST(__VA_ARGS__) OMIT_FIRST(__VA_ARGS__)
但这只是解决了问题,因为现在OMIT_FIRST
触发了此错误
编辑:
我正在尝试做的是:
我在AVR汇编程序(微控制器)中具有功能
delay_37us:
ldi r16, 227
delay_592c_aw:
dec r16
brne delay_592c_aw
nop
nop
ret
该活动等待592个周期(对于16MHz cpu为37us)
为了用C调用此函数,我必须将其标记为.global
,并提供此类函数的C声明。为了简化此类函数的声明,我将使用类似的宏
FUNCTION_DECL(void, delay_37us);
将被定义为
#ifdef __ASSEMBLER__
#define FUNCTION_DECL(ret, name, ...) .global name
#else
#define FUNCTION_DECL(ret, name, ...) ret name(__VA_ARGS__)
#endif
这样我就可以为C和ASM使用一个头文件。我目前正在使用的是一个具有以下内容的头文件
#ifdef __ASSEMBLER__
.global delay_37us
.global delay_ms
.global delay_1s
#else
void delay_37us();
void delay_ms(unsigned char);
void delay_1s();
#endif
哪些易于维护。