宏的不定参数、可变参数 写法 #defineuprintf1(...)printf(__VA_ARGS__) #defineuprintf2(format, ...)printf(format, __VA_ARGS__) 注意,宏对参数列表的个数很敏感,若是使用第二种uprintf2写法,必须至少传两个参数,若只是uprintf("hello world"),会出错。
方法1是在类型固定的参数中指明后面有多少个参数以及他们的类型。printf就是采用的这种方法,它的format参数指明后面每个参数的类型。 方法2是指定一个结束参数。这种情况一般是不定参数拥有同样的类型,我们可以指定一个特定的值来表示参数列表结束。 #include <stdio.h>#include<stdarg.h>#include<string.h>intsumi(...
char *,v是输入的第一个参数。首先在理解这个宏的前提要理解函数的形参是如何存储,这里我们做个试验如下图所示 形参是存储在栈里面的,栈的高地址在上,低地址在下,那么由上图可以得到的是,x,y,z在栈中存储的结构从上到下依次为z,y,x。那么(va_list)&v的意思就是取第一个参数的地址并强制转化为...
为了方便,我们设n = sizeof(n),m = sizeof(int),也就是(n + m - 1)/m中的n和m,那么我们可以得到(n + m - 1)/m的意思就是sizeof(n)是需要(n + m - 1)/m = x个sizeof(int),那么x * m就是这个宏的值,也就是((n + m - 1)/m ) * m就是宏的值,注意数学与计算机科学的差别,...
stdarg.h库文件定义了三个宏,这三个宏可用于在参数个数未知(即在参数个数可变)时,获取函数中的参数。可变参数的函数通常在参数列表的末尾是用...定义的。 4.不定参数使用实例分析 下面是一个使用不定参数的函数的代码实例分析。 inttask_post_event(char*name,intargc,...){intparam_len=0...
果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing). #incldue <stdio.h> #define PSQR(x) printf("the square of" #x "is %d./n",(x)*(x)) int main(void) { int y =4; PSQR(y) PSQR(2+4); ...
今天学习了C语言不定参数,C语言中的不定参数主要靠<strarg.h>这个头文件实现,这个头文件包含了va_list()、va_start()、va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访问参数列表未确定的部分。这个变量是由va_start来初始化的。它的第一个参数是va_list的变量名,第二个参数是省略号前最后...
1.仅仅只支持字符串常量,不支持可变参数 #define LOGFUNC(...) (printf(__VA_ARGS__)) 1. 2.仅仅只支持可变参数,不支持字符串常量 #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__) 1. 对于__VA_ARGS__的缺点,使用##__VA_ARGS__直接...
通过使用##__VA_ARGS__可以输出不定长参数,功能和printf函数一样; 通过DEBUG_TO_FILE宏控制选择将日志输出到控制台或者输出到文件中; 通过_DEBUG宏决定是否输出日志,如果是开发用于调试,可以定义这个宏,方便查看日志,如果是给用户使用,那么可以不定义这个宏; ...
访问各个参数 其实前文已经告诉我们怎么去访问不定参数。va_start和va_arg函数可以被结合起来用于依次访问每个函数,他们实际上都是宏函数。 在vc6,va_start函数定义为: #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & "(sizeof(int) - 1) ) ...