返回信息流问一下如何用宏实现变长参数,能够展开成
SetArray(arr, a0, a1, /*...*/ an);
=>
arr[0]=a0;
arr[1]=a1;
//...
arr[n]=an;
在网上看了看,只有提到
#define foo(...) bar(__VA_ARGS__)
这样的变长宏参数,但没有提到如何获取每一个宏参数。不知道能这么做吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #30317同步于 2009/10/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]关于宏中的变长参数
FadeToBlack
2009/10/23镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 FadeToBlack 的大作中提到: 】
: 问一下如何用宏实现变长参数,能够展开成
: SetArray(arr, a0, a1, /*...*/ an);
: =>
: ...................
这个不能获取每个参数的,仅仅只是让编译器知道有这么个东西
我就是懒得建个数组,才用宏.....
直接传数组不还得建数组么,麻烦
【 在 reeze 的大作中提到: 】
: 动态语言里倒是有这样的东西。
: 是在不行,直接传数组进去。
用3个标准C宏 va_arg va_start va_end
这几个宏屏蔽了不同体系结构程序栈布局的不同
可以看一下printf,scanf之类C库函数的源码,基本原理如下
#include <stdio.h>
#include <stdarg.h>
void func_with_va_arg(int cnt, ...);
int main(int argc,char *argv[])
{
func_with_va_arg(4, 1, 2, 3, 4);
func_with_va_arg(3, 1, 2, 3);
return 0;
}
void func_with_va_arg(int cnt, ...)
{
int val = 0;
int i = 0;
va_list arg_ptr;
va_start(arg_ptr, cnt); //得到第一个可变参数地址
for(i = 0; i < cnt; ++i)
{
val = va_arg(arg_ptr, int); //指针移动sizeiof(int), 得到下一个可变参数地址
printf("arg%d=%d; ", i+1, val);
}
putchar('\n');
}
你回帖敢看帖吗........
【 在 jokerlee (Jackal The Dire) 的大作中提到: 】
: 用3个标准C宏 va_arg va_start va_end
: 这几个宏屏蔽了不同体系结构程序栈布局的不同
: 可以看一下printf,scanf之类C库函数的源码,基本原理如下
: ...................
我要宏里面能用的,你给我函数里的干啥? [em6][em6][em6]
【 在 jokerlee 的大作中提到: 】
: 回帖怎么了?
: 这难道不是变长参数么?