代码之家  ›  专栏  ›  技术社区  ›  Michael Mior

C99中有0个参数的可变宏

  •  9
  • Michael Mior  · 技术社区  · 15 年前

    我有一些调试代码,如下所示:

    #define STRINGIFY(x) #x
    #define TOSTRING(x) STRINGIFY(x)
    #define AT __FILE__ ":" TOSTRING(__LINE__)
    void __my_error(const char*loc, const char *fmt, ...);
    #define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)
    

    使用最后一个宏,以便我可以在调试输出中插入发生错误的位置。但是,当我这样调用函数时:

    my_error("Uh oh!");
    

    我会的 喜欢

    error: ISO C99 requires rest arguments to be used
    

    my_error("Uh oh!", NULL);
    

    1 回复  |  直到 15 年前
        1
  •  14
  •   Michael Mior    12 年前

    我认为这个问题有两种解决办法。(如果算上“坚持gcc”,则为3)。

    特例宏

    #define my_errorf(str) my_error(str, NULL)
    


    反对的论点: 使用错误的宏很容易(但至少在编译时会注意到这一点)。

    fmt

    Vararg宏只能有uu VA_uargs_uuu作为参数(与Vararg函数不同)。所以你可以把 fmt公司

    void __my_error(const char *loc, ...);
    #define my_error(...) __my_error(AT, __VA_ARGS__)
    

    赞成 :一个语法/宏用于所有错误消息。
    反对的论点 :需要重写 __my_error