Tag: 可变函数

将va_list转换为变量参数?

我有一个函数log_message它需要变量参数。 log_message(int level, char *fmt, …) 现在在调用this( log_message )函数之前我必须添加新函数( _log_message ),新函数将调用log_message 。 _log_message(int level, char *fmt, …) 新function也一样。 当_log_message将调用log_message它会将变量输入转换为va_list 。 现在我有va_list ,我不想改变原来的那个,有没有办法改变回变量输入,所以我将能够调用原始的( log_message )。

获取函数参数类型

假设我调用了一个函数,该函数在我的源代码中获取了可变数量的参数。 我想对这个源代码进行某种静态分析,以找到实际传递给函数的参数类型。 例如,如果我的函数调用是 – foo(a,b,c) 我想找到a,b和c的数据类型并存储此信息。

如何确定va_arg列表的结尾?

我有一个函数foo(char *n, …); 我需要获取并使用所有可选的char参数。 我有个想法 while(va_arg(argPtr, char) != NULL) { … } 了解何时到达列表末尾。 那么,它会起作用吗,如果在函数调用中我会做foo(n, ‘t’, ‘m’, ‘$’, NULL); ? va_arg会将NULL读为char吗? 或者可能有一种更常见的方法来确定列表的结尾,而不添加NULL作为最后一个参数?

有没有办法从varargs函数的参数中检索浮点数?

如果函数是用原型定义的,该原型明确说明了参数的类型,例如。 void somefunc(int arg1, float arg2); 但实施为 void somefunc(int arg1, …) { … } 是否可以使用va_arg来检索浮点数? 它通常被禁止这样做,因为varargs函数具有隐式类型提升,例如float to double,因此尝试检索未启动类型是不受支持的,即使使用未启动类型调用函数对更具体的函数原型也是如此。 这样做的原因是在运行时检索不同类型的参数,作为obj-c解释器的一部分,其中一个函数将被重用于所有不同类型的方法。 这最好是独立于架构(因此,如果没有其他相同的代码在模拟器和设备上工作),尽管如果没有办法这样做,那么将接受设备特定的修复。 编辑:忘了特别提到:函数知道参数的类型和数量(它查找要使用SEL _cmd参数进行地图查找解释的代码)

可变C函数中的空值

如果我定义了一个可变函数: #include #include int f(char*s,…) { va_list ap; int i=0; va_start(ap, s); while(s) { printf(“%s “, s); i++; s=va_arg(ap,char*); } va_end(ap); return i; } int main() { return f(“a”,”b”,0); } gcc(linux x64)编译这个,exe运行并打印“ab”。 有没有需要像这样的演员: return f(“a”,”b”,(char*)0) 在共同的系统上?

C varargs – va_copy问题

我在C中编写一个函数,它接受可变数量的参数。 size_t myprintf(char *fmt, …); 到现在为止还挺好。 我已经决定最好做Right Way™并创建一个带有变量参数的版本,另一个版本带有一个va_list 。 size_t myprintf(char *fmt, …); size_t myvprintf(char *fmt, va_list args); 没那么难。 除了my_vprintf()需要将其args发送到两个不同的函数(首先是长度为0的snprintf()以确定我们需要多少空间,然后在我们分配了那么多空间之后再到sprintf() )。 我用va_copy做这个。 size_t myvprintf(char *fmt, va_list args) { va_list args2; va_copy(args, args2); // do stuff with args2 va_end(args2); // do more stuff with args } 这一切都很好,花花公子,但C99实施起来有点差。 我希望,如果可能的话,我的代码也可以在C89中工作,并且可以与尽可能多的编译器和尽可能多的平台一起工作。 我目前在#include 但在任何代码之前有这个: #ifndef va_copy # ifdef __va_copy # […]

Objective-c:在方法中访问可变参数

可能重复: 如何在Objective-C中创建变量参数方法 Objective C中可变数量的方法参数 – 需要一个例子 以下是具有可变参数的方法的示例。 – (void)numberOfParameters:group,… { NSLog(@”%@”,group); } 在上面的方法中,我知道访问第一个可变参数。 你能帮助我访问其他人吗? 我正在阅读ObjC.pdf并且我正在阅读第35页,行号是4

C variadic函数:如何指定要赋予va_arg的类型

在像printf这样的函数中,我们使用stdarg.h来处理可变参数。 void print(int args,…){ va_list ap; va_start(ap, args); int i = 0; for(i=0; i<args; i++){ printf("%d\n",va_arg(ap, int)); } va_end(ap); } 我们想要解析格式列表(赋予我们的可变参数函数的第一个参数)来跟踪格式列表中指定的参数类型,然后使用适当的类型调用va_arg。 我创建了第一个循环来解析格式列表,将说明符字母存储到数组中。 所以我知道我们期望的类型和数量。 例如: ft_like_printf(“Watch your %d %s\n”, 6, “Spider pig”); specifiers_list = “ds”所以d int和s char *(与printf相同的说明符) 但是如何动态编码呢? 使用不同类型调用va_arg的语法是什么? 我已经读过这个和我认为我正在寻找的东西,不是吗? 如果是,那该怎么办? 包含enum + union或包含union +函数指针的struct的struc的真实案例场景是什么? 为了处理不同的数据类型,我从这开始: typedef struct s_flist { char c; (*f)(); } t_flist; […]

变量函数和常量

可变函数究竟如何处理数字常量? 例如,考虑以下代码: myfunc(5, 0, 1, 2, 3, 4); 该函数如下所示: void myfunc(int count, …) { } 现在,为了用va_arg迭代单个参数,我需要知道它们的大小,例如int , short , char , float等。但是我应该假设数字常量的大小,就像我在上面的代码中使用的那样? 测试表明,假设为它们的int似乎工作正常,所以编译器似乎将它们推送为int即使这些常量也可以用单个char表示或者每个short 。 不过,我正在寻找我所看到的行为的解释。 C中用于将数字常量传递给可变参数函数的标准类型是什么? 这是明确定义还是依赖于编译器? 32位和64位架构之间有区别吗? 谢谢!

是否有可能在C中具有可变参数函数且没有非可变参数?

我有以下function: void doStuff(int unusedParameter, …) { va_list params; va_start(params, unusedParameter); /* … */ va_end(params); } 作为重构的一部分,我想删除未使用的参数,而不另行更改函数的实现。 据我所知,当你没有要引用的最后一个非变量参数时,不可能使用va_start 。 有没有办法解决? 背景:它实际上是一个C ++程序,所以我可以使用这里建议的一些运算符重载魔法,但我希望此时不必更改接口。 现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数。 回应评论:我不必删除未使用的参数,但如果有一个干净的方法,我会这样做。 我希望有一些我想念的简单。