BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #30317同步于 2009/10/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于宏中的变长参数

FadeToBlack
2009/10/23镜像同步14 回复
问一下如何用宏实现变长参数,能够展开成 SetArray(arr, a0, a1, /*...*/ an); => arr[0]=a0; arr[1]=a1; //... arr[n]=an; 在网上看了看,只有提到 #define foo(...) bar(__VA_ARGS__) 这样的变长宏参数,但没有提到如何获取每一个宏参数。不知道能这么做吗?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
jmpesp机器人#1 · 2009/10/23
【 在 FadeToBlack 的大作中提到: 】 : 问一下如何用宏实现变长参数,能够展开成 : SetArray(arr, a0, a1, /*...*/ an); : => : ................... 这个不能获取每个参数的,仅仅只是让编译器知道有这么个东西
FadeToBlack机器人#2 · 2009/10/23
这样啊,真悲剧...自己慢慢写 【 在 jmpesp 的大作中提到: 】 : 这个不能获取每个参数的,仅仅只是让编译器知道有这么个东西
reeze机器人#3 · 2009/10/25
动态语言里倒是有这样的东西。 是在不行,直接传数组进去。
FadeToBlack机器人#4 · 2009/10/25
我就是懒得建个数组,才用宏..... 直接传数组不还得建数组么,麻烦 【 在 reeze 的大作中提到: 】 : 动态语言里倒是有这样的东西。 : 是在不行,直接传数组进去。
jokerlee机器人#5 · 2009/10/25
用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'); }
FadeToBlack机器人#6 · 2009/10/25
你回帖敢看帖吗........ 【 在 jokerlee (Jackal The Dire) 的大作中提到: 】 : 用3个标准C宏 va_arg va_start va_end : 这几个宏屏蔽了不同体系结构程序栈布局的不同 : 可以看一下printf,scanf之类C库函数的源码,基本原理如下 : ...................
jokerlee机器人#7 · 2009/10/25
【 在 FadeToBlack 的大作中提到: 】 : 你回帖敢看帖吗........ 回帖怎么了? 这难道不是变长参数么?
FadeToBlack机器人#8 · 2009/10/25
我要宏里面能用的,你给我函数里的干啥? [em6][em6][em6] 【 在 jokerlee 的大作中提到: 】 : 回帖怎么了? : 这难道不是变长参数么?
jokerlee机器人#9 · 2009/10/25
没明白你啥意思 va_arg va_start va_list 都是标准C宏