PP_ARG_N(...)会展开为该宏调用中参数的个数,它利用PP_ARG_X宏作为辅助,PP_ARG_X有M+2个固定参数,再加一个可变参数列表,其展开为固定参数列表的最后一个参数 XX。 当通过PP_ARG_N给PP_ARG_X传递的变参列表__VA_ARGS__代表的参数列表长度为 N 时,PP_ARG_X的参数 XX 将展开为 N,于是我们就得...
使用GCC的变参宏(Varadic Macros)扩展实现: 1/*2* main.c3*4* Created on: 2015年1月29日5* Author: lucifet6*/78#include <stdio.h>9#include <stdarg.h>1011#defineAPP_DETAIL 012#defineAPP_MSG 113#defineAPP_WARN 214#defineAPP_ERROR 315#defineAPP_FAIL 416#defineAPP_FATAL 51718#defineTRUE ...
变参宏的实现形式其实跟变参函数差不多:用… 表示变参列表,变参列表由不确定的参数组成,各个参数之间用逗号隔开。可变参数宏使用 C99 标准新增加的一个 VA_ARGS 预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list、va_start、va_end 这些宏去解析变参列表。预处理器在将宏展开...
【C 语言基础】通过一个实例了解 va_list VA_LIST 是在C语言中解决【变参问题】的一组宏,【变参问题】是指参数的个数不定, 可以传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同; 可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 其中va_list 表示可变参数列...
12.1 什么是可变参数宏 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用va_list、va_start、va_end等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。
其实C99 标准已经支持了这个特性,但是其它的编译器不太给力,对 C99 标准的支持不是很好,只有 GNU C 支持这个功能,所以有时候我们也把这个可变参数宏看作是 GNU C 的一个语法扩展。 对于LOG 函数,如果我们想使用一个变参宏实现,就可以直接这样定义。
运行结果: sum = 6 sum = 30 其实本质上就是用int arg[] = {VA_ARGS}对宏的变参部分构造了一个局部变量数组,便于求出参数的数量。 5月份注册的简书,今天才写第一篇文章啊,转载请注明出处哦^_^
1) va_start 宏 作用: 根据 A 取得可变参数表的首指针并赋值给 ap。 原理: 根据最后一个固定参数 A 的地址 + 第一个变参对 A 的偏移地址,然后赋值给 ap,这样 ap 就是可变参数表的首地址(函数传递的参数会从右向左依次入栈,并且 ARM 的栈为降栈,所以参数 A 的地址最低)。
变参列表的宏函数 C语言提供了一组宏函数,用来对变参列表进行操作,分别是:va_startva_argva_endva_copy 这四个宏函数对变参裂变进行的相关数据,都保存在C语言标准提供的va_list结构里。这四个宏函数的作用如下:va_start 表示对变参列表开始操作。va_copy 创造变参列表的一份副本。va_arg 表示将要访问...
这三个点用在宏中就是变参宏(Variadic Macros),默认名称为__VA_ARGS__。如: #define WriteLine(...) { printf(__VA_ARGS__); putchar('\n');} 再WriteLine("MoreWindows"); 考虑下printf()的返回值是表示输出的字节数。将上面宏改成: