##__VA_ARGS__ not swallowing comma when zero args under C99

后端 未结 3 491
囚心锁ツ
囚心锁ツ 2021-01-24 09:13

I\'d like to use a macro like the following:

#define x(...) y(a,##__VA_ARGS__,b)

To expand like so:

x();   ->   y(a,b);
x(1)         


        
相关标签:
3条回答
  • 2021-01-24 09:30

    As you describe, the following pattern works fines.

    #define x(a,...) y(a,##__VA_ARGS__)
    

    After I run the following code snip, I guess ##__VA_ARGS__ will always swallow comma when the prefix args exists(such as _ in the e_x)

    #define x(...) y(a,c, ##__VA_ARGS__, b)
    #define e_x(_, ...) y(a, c, ##__VA_ARGS__, b)
    
    x();
    x(a);
    x(a, b);
    
    e_x();
    e_x(a);
    e_x(a, b);
    

    You can get the result:

    y(a,c,, b);
    y(a,c,a, b);
    y(a,c,a, b, b);
    
    y(a, c, b);
    y(a, c, b);
    y(a, c, b, b);
    

    Above sample works fine in my computer(both macos and linux) .

    0 讨论(0)
  • 2021-01-24 09:39

    That's expected behaviour. There is no standard way to swallow the comma.

    Fortunately, gcc, clang and xlc support the ##__VA_ARGS__ gnu extension, and msvc swallows the comma automatically.

    If you don't want to rely on above mentioned language extensions, the idiomatic ISO C90 way to get variable argument macros was like this:

    #define x(args) y args
    
    /* notice the extra parantheses */
    x((a, b, c, d));
    

    If you don't want to use either of these solutions, you can always employ argument counting, as answered here.

    0 讨论(0)
  • 2021-01-24 09:52

    Yes, ##__VA_ARGS__ is a GNU extension.

    0 讨论(0)
提交回复
热议问题