在C中,是否可以转发可变参数函数的调用?如,
int my_printf(char *fmt, ...) {
fprintf(stderr, "Calling printf with fmt %s", fmt);
return SOMEHOW_INVOKE_LIBC_PRINTF;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,以上述方式转发调用显然不是必需的(因为你可以用其他方式记录调用,或者使用vfprintf),但是我正在处理的代码库要求包装器做一些实际的工作,并且没有没有(并且不能添加)类似于vfprintf的辅助函数.
[更新:基于迄今为止提供的答案,似乎存在一些混淆.用另一种方式表达问题:通常,你可以包装一些任意的可变参数函数而不修改该函数的定义.
...在ObjectiveC中遇到一些问题.
我基本上包装一个方法,并希望接受一个nil终止列表,并直接将相同的列表传递给我正在包装的方法.
这是我的,但它会导致EXC_BAD_ACCESS崩溃.检查当地的变量,它似乎otherButtonTitles只是一个NSString传入的时间otherButtonTitles:@"Foo", nil]
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
delegate:(id)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ...
{
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:title
message:message
delegate:delegate
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:otherButtonTitles] autorelease];
[alert show];
}
Run Code Online (Sandbox Code Playgroud)
我如何简单地从参数传出到传出参数,从而保留完全相同的nil终止列表?
我无法理解Objective-C中多个参数的语法.我已经看到了这个问题,但答案并没有帮助我(还).
这是我的代码(实际上我希望最终传递给NSString stringWithFormat,但是让NSLog工作现在已经足够了):
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
[self log:@"blah blah %d", 32];
}
- (void)log:(NSString *)text, ... {
va_list args;
va_start(args, text);
NSLog(text, args);
}
Run Code Online (Sandbox Code Playgroud)
参数(或一些参数)通过,但它有一些奇怪的值(输出是blah blah 1606412704).我应该如何传递通过的值...?