
#define _CRT_SECURE_NO_WARMINGS#include stdio.h#include stdlib.h#include assert.h#include string.h#include errno.h//1 预处理指令//include//用于引用头文件为了能够使用头文件中声明或定义的函数和变量引用头文件的方式有2种//#includestdio.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.hint 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;}