通用解决方案“ ISO C99要求可变参数宏中的“ ...”至少有一个参数”

时间:2018-12-08 10:17:44

标签: c-preprocessor

通用的解决方法是什么

  

警告: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_argsproduces错误的扩展。

解决方案的示例是具有两个宏,然后简单的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

哪些易于维护。

0 个答案:

没有答案