#define _CRT_SECURE_NO_WARMINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <errno.h>
//1 预处理指令
//include
//用于引用头文件,为了能够使用头文件中声明或定义的函数和变量,引用头文件的方式有2种
//#include<stdio.h> //引用的编译器的默认的头文件的位置
//include "a.h" //引用当前工程中的头文件
//引入头文件名可以是文件路径
//#include <sys/a.h> //引入默认系统的头文件的位置
//如
//#error
//让编译器停止编译,并给出停止编译的原因
//语法
//#error "原因"
//应用场景
//#ifndef 宏
//#error 未定义
//#endif
//如
//#pragma
//此指令非常强大 可以改变编译器的环境 如对齐方式 警告 数据段等
//但在不同的VS版本中支持的指令也不一样 因此存在兼容性的问题 所以少用为好
//常用的指令
//#pragma once //只引入一次头文件
//#pragma pack(1)
//按定义当前程序的字符集编码,此指令只有2015+才有效
//字符集名称 utf-8 unicode gbk ansl
//#pragma execution_character_set(字符集名称)
//#pragma warning() //禁止显示。。。的警告
//如
//2变长参数
//语法
//... 表示为变长参数 可以存在多个 也可以不写
// ...前面至少存在一个参数
//返回值类型 函数名(参数类型 参数名,...)
//int add(int a,...)
//变长参数的访问
//引入头文件 <stdarg.h>
//1 定义 va_list 类型的变量
//va_list ap;
//2 开启获取变长参数
//va_start(ap,第一个形式参数)
//3获取参数值
//数据类型 变量名 va_arg(ap,变量名)
//如果变量获取完成后 则va_arg返回值为小于0的值
//4 在变长参数中,应该设计结束标识 如0,在结束之前,应该设置变长参数变量为空
#include <stdio.h>
#include <stdarg.h>
int add2(int a, ...);
int main() {
int ret = add2(10, 2, 1, 3, 4, 0);
ret = add2(ret, 5, 8, 0);
ret = add2(ret, 9, 0);
ret = add2(ret, 0);
printf("ret is %d\n", ret);
return 0;
}
int add2(int a, ...) {
// 1. 定义va_list变量
va_list ap;
// 2. 开启读取变长参数
va_start(ap, a);
// 3. 循环读取所有变长参数
int n = 0;
int ret = a;// 返回累加的结果
while ((n = va_arg(ap, int)) != 0) {
printf("%d ", n);
ret += n;
}
printf("\n");
// 4. 结束变长参数
va_end(ap);
return ret;
}