c语言中如何实现不定长参数的宏?

谢谢楼下的回答,我知道用普通函数可以实现,我就想知道用宏函数到底有无可能实现变长参数,如果不能我要考虑其他方法解决我的问题了。

宏很难实现变长参数,不过c提供了函数来处理,在c中printf,scanf等函数就是处理变长参数列表的。
如:
#include <stdio.h>
#include <stdarg.h>

void print_ints(int, num_of_args, ...)
{
int total = 0, i;
va_list ap;
va_start(ap, num_of_args);
while(num_of_arg--){
i = va_arg(ap, int);
printf("%d\n", i);
total += i;
}
printf("Total is %d \n", total);
va_end(ap);
}
如果使用
print_int(3, 20, 35, 15);
来调用,则输出:
20
35
15
Total is 70
有关函数:
va_start(argptr, parm) 使用argptr对参数列表和第二个参数parm的名称进行初始化
va_arg(argptr, type) 返回参数表中的下一个参数,它必须包含所指定的type
va_end(argptr) 终止参数读取

参考资料:C++ 语言命令详解

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-07
//实现参考下面 __VA_ARGS__
#define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__)

void CCLog(const char * pszFormat, ...)
{
char szBuf[MAX_LEN];
va_list ap;
va_start(ap, pszFormat);
vsnprintf_s(szBuf, MAX_LEN, MAX_LEN, pszFormat, ap);
va_end(ap);
WCHAR wszBuf[MAX_LEN] = {0};
MultiByteToWideChar(CP_UTF8, 0, szBuf, -1, wszBuf, sizeof(wszBuf));
OutputDebugStringW(wszBuf);
OutputDebugStringA("\n");
WideCharToMultiByte(CP_ACP, 0, wszBuf, sizeof(wszBuf), szBuf, sizeof(szBuf), NULL, FALSE);
printf("%s\n", szBuf);
}
第2个回答  2006-12-24
宏只是替换

你想要它在预编译阶段知道运行时才能得到的参量个数恐怕是不行的,

如楼上,我也只能想到是用变参做了
第3个回答  2014-07-30
C89是没有变参宏的,可以变通一下
#define DEBUG printf("%s,%d:",__FUNCTION__,__LINE__);printf