1#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) 这里,’…’指可变参数。这类宏在被调用时,它(这里指’…’)被表示成零个或多个符号,包括里面的逗号,一直到到右括弧结束为止。当被调用时,在宏体(macro body)中,那些符号序列集合将代替里面的__VA_ARGS__标识符
因为上面的例子中若__VA_ARGS__含有变量,整个printf的输出与变量便不能一一对应,输出会出错。 如果仅仅是替换函数名,可用如下方式,此时对__VA_ARGS__无任何特殊要求:#define myprintf(...) printk( __VA_ARGS__),在调试程序时可以这样用: 1#ifndef LOG_NDEBUG_FUNCTION2#defineLOGFUNC(...) ((void)0)3...
VA_ARGS __VA_ARGS__是C语言设定的一个预定义宏,用于处理可变参数的参数列表。通常用在宏定义中,以便宏可以接收不定数量的参数,并将他们作为整体处理。 通常的函数参数列表都是固定的,但也存在着不定参数数量的函数,如:printf,为了定义可以处理不同参数个数的宏,C99标准引入了VA_ARGS,下列的代码均在C99及C99...
C/C++ 代码编译过程中,可通过相应参数来获取到各编译步骤中的产出,比如想看被预处理编译之后的宏,使用gcc使加上-E参数。 $ gcc -E macro.c 宏的定义 通过#define指令定义一个宏。 #defineNAME_OF_MACRO value 比如,以下代码定义了一个名为BUFFER_SIZE的宏,指代1024这个数字。 #defineBUFFER_SIZE1024 使用时...
C/C++ #MACRO 和 #pragma 的高级用法梳理,主要内容:#、##、__VA_ARGS__和##__VA_ARGS__的作用、__FILE__,__LINE__,__FUNCTION__的作用#pragama用法先举一个例子,会用到上面这些宏:1#definemyprintf(...)printk("[lch]:File:%s
C 语言中的宏(macro)是一种预处理指令,可以在编译前将代码中的符号替换为指定的文本。宏可以简化代码并提高可读性,也可以用来实现一些高级的功能。在大型开源项目中,经常可以看到宏的各种用法。 宏的定义 宏的定义使用#define关键字,格式如下: #define 宏名称 宏取代文本 ...
printf(fmt, __VA_ARGS__) ^ applications\main.c:36:5: note: in expansion of macro 'myprintf_a' myprintf_a("hello"); 为什么呢? 我们展开 myprintf_a("hello"); 之后为 printf("hello",)。因为没有不定参,所以,__VA_ARGS__ 展开为空白字符,这个时候,printf 函数中就多了一个 ‘,’(逗号)...
C Macro va_arg - Learn how to use the va_arg macro in C for variable argument functions. Understand its syntax, examples, and practical applications.
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__ 来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。 如果调用:debug2("code = %d", 100); 这样调用没有问题。
这里,'...'指可变参数。这类宏在被调用时,它(这里指'...')被表示成零个或多个符号,包括里面的逗号,一直到到右括弧结束为止。当被调用时,在宏体(macro body)中,那些符号序列集合将代替里面的__VA_ARGS__标识符。更多的信息可以参考CPP手册。