How to make a variadic macro (variable number of arguments)

前端 未结 5 1417
遥遥无期
遥遥无期 2020-11-22 11:48

I want to write a macro in C that accepts any number of parameters, not a specific number

example:

#define macro( X )  something_complicated( whateve         


        
相关标签:
5条回答
  • C99 way, also supported by VC++ compiler.

    #define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
    
    0 讨论(0)
  • 2020-11-22 12:26

    __VA_ARGS__ is the standard way to do it. Don't use compiler-specific hacks if you don't have to.

    I'm really annoyed that I can't comment on the original post. In any case, C++ is not a superset of C. It is really silly to compile your C code with a C++ compiler. Don't do what Donny Don't does.

    0 讨论(0)
  • 2020-11-22 12:30
    #define DEBUG
    
    #ifdef DEBUG
      #define PRINT print
    #else
      #define PRINT(...) ((void)0) //strip out PRINT instructions from code
    #endif 
    
    void print(const char *fmt, ...) {
    
        va_list args;
        va_start(args, fmt);
        vsprintf(str, fmt, args);
            va_end(args);
    
            printf("%s\n", str);
    
    }
    
    int main() {
       PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
       return 0;
    }
    

    If the compiler does not understand variadic macros, you can also strip out PRINT with either of the following:

    #define PRINT //
    

    or

    #define PRINT if(0)print
    

    The first comments out the PRINT instructions, the second prevents PRINT instruction because of a NULL if condition. If optimization is set, the compiler should strip out never executed instructions like: if(0) print("hello world"); or ((void)0);

    0 讨论(0)
  • 2020-11-22 12:33

    I don't think that's possible, you could fake it with double parens ... just as long you don't need the arguments individually.

    #define macro(ARGS) some_complicated (whatever ARGS)
    // ...
    macro((a,b,c))
    macro((d,e))
    
    0 讨论(0)
  • 2020-11-22 12:43

    explained for g++ here, though it is part of C99 so should work for everyone

    http://www.delorie.com/gnu/docs/gcc/gcc_44.html

    quick example:

    #define debug(format, args...) fprintf (stderr, format, args)
    
    0 讨论(0)
提交回复
热议问题