zoukankan      html  css  js  c++  java
  • C++ preprocessor __VA_ARGS__ number of arguments

    #include <stdio.h>
    #include <string.h>
    #include <stdarg.h>
    
    #define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))
    #define SUM(...)      (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))
    
    void sum( int numargs, ... );
    
    int main( int argc, char *argv[ ] )
    {
    
      SUM( 1 );
      SUM( 1, 2 );
      SUM( 1, 2, 3 );
      SUM( 1, 2, 3, 4 );
    
      return 1;
    }
    
    void sum( int numargs, ... )
    {
      int total = 0;
      va_list ap;
    
      printf( "sum() called with %d params:", numargs );
      va_start( ap, numargs );
      while ( numargs-- )
      {
        total += va_arg(ap, int);
      }
      va_end( ap );
    
      printf( " %d\n", total );
    
      return;
    }

    It is completely valid C99 code. It has one drawback, though - you cannot invoke the macro SUM() without params,
    but GCC has a solution to it - http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

    So in case of GCC you need to define macros like this and it will work even with empty parameter list

    #define       NUMARGS(...)  (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
    #define       SUM(...)      sum(NUMARGS(__VA_ARGS__), ##__VA_ARGS__)

    use this GNU extension, Just remember - it only works with GNU compiler.

    #define macro(format, arguments...) fprintf(stderr, format, ##arguments)

    The ## token in combination with __VA_ARGS__ is a gcc extension that's not part of ISO C99.


  • 相关阅读:
    vue-cli创建项目 一直downloading解决办法
    Win7点击文件夹右键可打开cmd控制台,并获取当前目录

    js apply/call/caller/callee/bind使用方法与区别分析
    click() bind() live() delegate()区别
    域名与IP对应,解决只能IP访问不能域名访问的问题
    element.style{}
    git
    new
    js 数组函数
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3102927.html
Copyright © 2011-2022 走看看