一、可变宏
1.#
可以接收一个参数,并把这个参数按照原来的字符串源码原样传给宏内部;
1 #define RR(x) printf(#x" "); 2 int main(){ 3 int a = 1; 4 RR(1); 5 RR(a); 6 return 0; 7 }
输出:
1 a
解释:#x 相当于x所代表的字符串;
2.##
可以接收多个参数,并且将多个参数原样替换,输入什么就替换成什么;
1 #define RR(fmt,args...) printf(fmt" ",##args); 2 int main(){ 3 int a = 1; 4 int b = 2; 5 RR("test--%d|%d",a,b); 6 return 0; 7 }
输出:
test--1|2
二、可变函数
参考菜鸟教程【https://www.runoob.com/】
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /* 为 num 个参数初始化 valist */ va_start(valist, num); /* 访问所有赋给 valist 的参数 */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* 清理为 valist 保留的内存 */ va_end(valist); return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %f ", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f ", average(3, 5,10,15)); }
输出:
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000