简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.
如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.
我知道函数定义中的最小参数数量为零,但函数定义中的最大参数数量是多少?我只是为了知识和好奇而问这个问题,而不是我要写一个真正的功能.
我有以下功能:
void doStuff(int unusedParameter, ...)
{
va_list params;
va_start(params, unusedParameter);
/* ... */
va_end(params);
}
Run Code Online (Sandbox Code Playgroud)
作为重构的一部分,我想删除未使用的参数,而不另行更改函数的实现.据我所知,va_start当你没有最后一个非变量参数引用时,就不可能使用它.有没有办法解决?
背景:它实际上是一个C++程序,所以我可以使用这里建议的一些运算符重载魔法,但我希望此时不必更改接口.
现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数.
在回应评论:我不具备删除未使用的参数,但我会做到这一点,如果有一个干净的方式来做到这一点.我希望有一些我想念的简单.
我正在尝试使用带有泛型类型的C stdarg.h lib.int类型,是我的泛型类型>要理解它,请继续阅读.所以,我的问题是:
我有一个函数接受可变数量的参数.喜欢
void function (int paramN, ...);Run Code Online (Sandbox Code Playgroud)
在我的程序中,没有办法知道,哪个是变量参数的类型,它可以是char,数组,int,short,函数点等...就像
function (paramN, "Hey, I'm a string", 1, function_pint, array, -1); // -1 is a sentinel.Run Code Online (Sandbox Code Playgroud)
所以,我认为,一个int,是32位,在x86(32位)系统中,这将保存所有内存地址.所以,如果我用int得到所有参数,那就不会有问题了,例如,"嘿,我是一个字符串"这个字符串的地址,通常适合32位变量,所以,我只需要制作演员.
我是正确的?
我可以做吗?
注意:我不想让我的函数像printf(这个解决方案,在这种情况下不适合好吗?)
谢谢你的回答.
抱歉我的英语不好.
我有来自第三方C库的可变参数函数:
int func(int argc, ...);
Run Code Online (Sandbox Code Playgroud)
argc表示传递的可选参数的数量.我正在用一个计算参数数量的宏来包装它,如此处所示.为了方便阅读,这里是宏:
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
_61, _62, …Run Code Online (Sandbox Code Playgroud) 全部,
我想the number of passed parameters在 va_list 中进行控制。
va_list args;
va_start(args, fmts);
vfprintf(stdout, fmts, args);
va_end(args);
Run Code Online (Sandbox Code Playgroud)
是否有可能获取 a 之后的参数数量va_start?