为了在宏定义中处理这种情况,可以使用变参宏。 变参宏允许你在宏定义中使用可变数量的参数。这使得宏能够更灵活地处理不同数量的参数。要使用变参宏,你需要使用特殊语法,并在宏名称后面添加一对空括号以指示它是一个变参宏。 以下是一个简单的示例,展示了如何使用变参宏: c复制代码 #include<stdio.h> // ...
变参宏函数定义 使用场景:日志、打印等 #define mog_error(format,...) fprintf(stderr, "[%s, %d]:"format"\n", __FILE__, __LINE__, ##__VA_ARGS__)
根据其意,‘##’宏用于字符串的连接操作,即将参数‘args’部分连接成一个字符串传给fprintf函数。但我认为宏定义本身就是‘字符串的替换’,完全不需要‘##’,即,传人的‘args’是什么,fprintf被传人的也是什么,不会有任何变化,也无需作任何操作,因此我修改宏如下: #defineprintf(args ) fprintf(stdout, args)...
}intfunction(intv,...){intReturnValue=0;inti=v; va_list ap ;//定义va_list类型变量,指向参数的指针ap;va_start(ap,v);//初始化这个变量,即指定这个变量所指向的有几个参数;cout<<ap[1]<<endl;//此时什么都输不出来;while(i>0) { ReturnValue+=va_arg(ap,int);//返回可变的参数。类型为int;...
变参宏定义中参数列表的最后一个参数为省略号(也就是三个点)。预定义宏‘__变参__’被用在替换部分中,以表示替换发生时省略号代表的内容。 例如: #包含 “习语言系统.接口” #定义 宏输出(...) 格式输出(“输出=>” __变参__ ) 整数类型 主函数(整数类型 参数个数, 字符类型* 参数[] ) ...
define PRINT(args)\ printf("PRINT:\t%s\t%i\n", __FILE__, __LINE__);printf args;\ printf("\n")调用的时候 PRINT( (参数列表) );用加括号的办法,不过用起来怪怪的 建议使用inline变参函数!
第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏 中,我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出 现。当上面的宏中我们只能提供第一个参数templt时,C标准要求我们必须写成: ...