参数列表在接受可变数量参数的 C 函数中重复传递

The parameter list is repeatedly passed in C function that accepts a variable number of arguments

我的OC代码是这样写的:

NSString * CMLocalizedString(NSString *key, ... ) {
    va_list valist = NULL;
    va_start(valist, key);
    NSString* value = va_arg(valist, id);
    va_end(valist);
    
    NSLog(@"key = %@, val = %@", key, value);
    
    return key;
}

int main(int argc, const char * argv[]) {
    
    CMLocalizedString(@"SSS", nil);
    CMLocalizedString(@"BBB", @"555", @"333", nil);
    CMLocalizedString(@"AAA");
    CMLocalizedString(@"CCC");
    
    return 0;
}

但是我的控制台输出是这样的

key = SSS, val = (null)
key = BBB, val = 555
key = AAA, val = 555
key = CCC, val = 555

为什么 va_list 收到重复值?

您的函数 CMLocalizedString 需要第二个参数。在最后两个调用中,您没有传递第二个参数,因此您不能期望函数有某种行为。先前调用的参数似乎被打印来代替丢失的参数只是巧合,可能是因为仍然位于相同的内存地址。