VA_ARGS是一个可变参数的宏,是新的 C99 规范中新增的,目前似乎只有 gcc 支持( VC 从 VC2005 开始支持)。 VA_ARGS需要配合 define 使用,总体来说就是将左边宏中 .. 的内容原样抄写在右边VA_ARGS所在的位置; 举个例子: #definemyprintf(...)printf( __VA_ARGS__) 示例代码如下: /***/ //@Author:猿...
#define MODULE_NAME "MY_LIBS" #define log_e(fmt, ...) printf("[ERROR]["MODULE_NAME"](%s|%d)"fmt,__func__,__LINE__,##__VA_ARGS__) #include <stdio.h>#defineMODULE_NAME "MY_LIBS"#definelog_e(fmt, ...) printf("[ERROR]["MODULE_NAME"](%s|%d)"fmt,__func__,__LINE__,...
对于第1次调用,__VA_ARGS__展开为1个参数:"Howdy"。 对于第2次调用,__VA_ARGS__展开为3个参数:"Weight = %d, shipping = $%.2f\n"、wt、sp。 因此,展开后的代码是: printf("Howdy"); printf("Weight = %d, shipping = $%.2f\n", wt, sp); 演示用例如下: // variadic.c -- variadic ...
举例来说,一个使用#__VA_ARGS__的宏定义可以是这样的: #define CONCAT(a, b, c) a##b##c #define MESSAGE(x) #x int main() { printf("%s\\\n", MESSAGE(CONCAT(Hello, World, !))); return 0; } 在这个例子中,CONCAT宏定义使用了##操作符将三个字符串常量拼接在一起,MESSAGE宏定义则使用...
在C语言中,如果你需要处理一些不确定数量的参数,那么__va_args__就是你的最佳选择。它允许你在函数调用时接受任意数量的参数,并将其存储在一个数组中。 一、基本用法 在使用__va_args__之前,你需要了解一些基本的C语言可变参数函数的用法。可变参数函数通常在模板中使用,但直接在普通函数中使用也很常见。要...
二.##__VA_ARGS__经典案例 有时,我们想把调试信息输出到屏幕上,而有时则又想把它输出到一个文件中,可参考下面的例子: AI检测代码解析 /***/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:C语言教程 - C语言 函数不定长参数 ##__VA_ARGS__经典...
在探讨Visual Studio中可变宏参数__VA_ARGS__展开的问题时,我们面临的是一个跨编译器的差异。当宏A具有可变参数,且在宏定义中将可变参数__VA_ARGS__传递给宏B时,这种行为在gcc或clang编译器中表现良好,__VA_ARGS__会被正确展开为实际参数,B在处理其参数时,将其视为多个变量处理。然而,在...
int arr_##name[2*size] = { __VA_ARGS__ }; 然后它将以以下方式使用: ARRAY_DEFDEC(test, 7, 1, 2, 3, 4, 5, 6, 7, ~1, ~2, ~3, ~4, ~5, ~6, ~7) 这将需要改变大量的逻辑,用户需要知道,除了初始化元素,还需要提供二进制逆,所以我不太喜欢这样做。
本文说的__VA_ARGS__,就是一个可变参数宏,与printf中可变参数的宏定义一个道理,是新C99规范中增加的。 __VA_ARGS__详情内容 1.关于__VA_ARGS__ __VA_ARGS__它是一个可变参数的宏,就是将左边宏中“...” 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。
//遍历不定参数,不定参数展开 <=9个 //vs中这种方式定义宏过度也不能用 //Parameters Table // Parameters Name // 计算 VA_ARGS 参数个数,最大支持64个参数 //vs中无参数时会返回1 { if (pImpl != NULL) { return pImpl->funcName(PARAM_NAME_FOR_EACH_(EXTAND_ARGS(...