)来表示函数可以接受可变数量的参数。例如: c int sum(int n, ...); 这里的sum函数接受至少一个参数n,表示后续可变参数的数量或类型信息,然后是可变数量的其他参数。 3. C语言变参函数的具体实现示例 要实现一个变参函数,需要使用stdarg.h头文件中的宏来处理可变数量的参数。以下是一个简单的变参函数实现...
#define va_list void*通过这句代码我们实现了定义va_list是一个指针,参数类型不定,它可以指向任意类型的指针。为了让arg指向第一个可变参数,我们用nr的地址加上nr的数据类型大小就行了,采用如下的定义可以实现。 #define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start)) 。
② 用固定值(如-1或NULL)表示最后一个参数 ③ 用格式化字符串,如printf函数 注:变参函数至少要提供一个参数
} 上面的代码很好理解:定义一个变参函数print_num,在函数内部先取得第一个参数的地址赋值给一指针,然后将指针后移,取得后面的参数并打印出来。在main函数中,传给print_num 6个参数,按这个逻辑,应该是打印出: *args:1 *args:2 *args:3 *args:4 *args:5 但是结果却出人意料: 打印出的值和传进去的值完全...
注意到,在函数中声明其参数是可变的方法是三个点“...”,但同时,这个函数必须要有一个固定的参数,比如printf里面的这个format,也就是说变参函数的参数数目至少是一个。这是由C语言中实现变参的原理---计算堆栈地址---决定的。顺着printf函数我们来看看它的定义是什么: ...
C语言的那些小秘密之变参函数的实现 如果有对AT&T汇编语法规则不懂的,可以看看我前面写的那篇文章。 到这儿为止是乎应该是说结束的时候了,但是细心的读者可能发现了一个问题,就是我们在最初给出的代码部分有一句红色标记的代码,如下: #define va_start(arg, start) arg = (va_list)(((char*)&(start)) ...
在学习C语言的过程中我们可能很少会去写变参函数,印象中大学老师好像也没有提及过,但我发现变参函数的实现很巧妙,所以还是特地在此分析下变参函数的实现原理。无需标准C的支持,我们自己写代码来实现。 先来看看一个实现代码: #include <stdio.h> #define va_list void* ...