ios - 将经历默认参数提升的对象传递给 'va_start'

标签 ios objective-c iphone xcode

这是我的第一个 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/

相关文章:

ios - 根据按钮选择状态将无法识别的选择器发送到实例

ios - 如何在ARC中释放实例变量-Objective-C

ios - 我的应用程序在 Debug模式下完美运行,但在 ad hoc 模式下却不行

iphone - UIDatePicker,根据日期名称和今天的日期设置最大和最小日期

ios - 检测是否手动输入了 HealthKit 事件

iphone - 将Plist填充到UITableView,保存在Document目录下

ios - 关于使用矩形图像创建圆形 UIImageView 的问题

ios - 连接苹果 watch 来解析通知?

ios - 如何在 Swift 中以编程方式旋转一组按钮?

objective-c - Objective-C : How to check for Leaks or Bad Access Errors