这是我的第一个 Xcode 应用程序和 Objective-C,所以给我一些宽松的时间:)
我尝试用谷歌搜索这个问题,但看不到任何有关 Xcode 和应用程序开发的帮助。我在//
之后添加了错误按摩- (id)initWithBytes:(int8_t)byte1, ... { //Error: 1. Parameter of type 'int8_t' (aka 'signed char') is declared here
va_list args;
va_start(args, byte1); //Error: Passing an object that undergoes default argument promotion to 'va_start' has undefined behavior
unsigned int length = 0;
for (int8_t byte = byte1; byte != -1; byte = va_arg(args, int)) {
length++;
}
va_end(args);
if ((self = [self initWithLength:length]) && (length > 0)) {
va_list args;
va_start(args, byte1); // Error: Passing an object that undergoes default argument promotion to 'va_start' has undefined behavior
int i = 0;
for (int8_t byte = byte1; byte != -1; byte = va_arg(args, int)) {
_array[i++] = byte;
}
va_end(args);
}
return self;
}
提前谢谢您!!
最佳答案
va_start()
将传递给函数的第一个参数的指针保存到 va_list
中。
参数本身通过硬件堆栈传递。
int8_t 的问题来自于硬件堆栈的实现方式。 (至少在 x86 中)
就像 SSE 和 MMX 一样,堆栈要求存储在其上的元素的对齐方式等于 16 位的倍数,因此传递给函数的所有内容都将至少具有 16 位大小,无论其类型如何。
但问题是 va_arg()
并不知道这一切。从历史上看,它是一个宏,它所做的只是返回存储在 va_list
中的指针,并将 va_list
增加 sizeof(type)
。
因此,当您检索下一个参数时,返回的指针并不指向下一个参数,而是指向它之前的一个字节,或者不指向 - 取决于 va_arg
是宏还是编译器构建的-in 函数。
这就是警告的含义。
至少在我看来。请原谅我的英语,这是我的第二语言。
关于ios - 将经历默认参数提升的对象传递给 'va_start',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58300687/