call函数定义内部,我try 使用三元运算符在循环中检索传递给它的各种参数.编译停止,出现expected specifier-qualifier-list before ‘(’ token错误.

#define ARG_N 3

char *args_types[ARG_N] = {"int", "float", "char"};

void call(...) {
  va_list args;
  void *args_values[ARG_N];
  va_start(args, NULL);
  for (int i = 0; i < ARG_N; ++i) {
    char *arg;
    arg = args_types[i];
    args_values[i] = (void *)va_arg(args, (strcmp(arg, "int") ? int : strcmp(arg, "float") ? float : char));
  }
  va_end(args);
}

int main(void) {
  call(6, 55.33, 'c');
  return 0;
}

据我所知,在未初始化的情况下使用 struct 时会出现此错误.在这种情况下,这意味着什么?

推荐答案

您正在try 使用三元运算符来 Select 类型.这是无效的语法,因为它只能用于 Select 一个表达式.

您将需要判断每个单独的类型名称,并基于该调用使用适当的类型参数调用va_arg.

  for (int i = 0; i < ARG_N; ++i) {
    char *arg = args_types[i];
    if (!strcmp(arg, "int")) {
        args_values[i] = (void *)va_arg(args, int);
    } else if (!strcmp(arg, "float")) {
        args_values[i] = (void *)va_arg(args, float);
    } else {
        args_values[i] = (void *)va_arg(args, char);
    }
  }

即使在解决了这个问题之后,您仍然有一个问题,因为在一种情况下,您试图将float转换为void *.不允许在浮点类型和指针类型(带有强制转换的事件)之间进行转换.

要解决这个问题,您可能需要 for each 值动态分配空间,并将指针分配给该动态分配的空间:

  for (int i = 0; i < ARG_N; ++i) {
    char *arg = args_types[i];
    if (!strcmp(arg, "int")) {
        int *p = malloc(sizeof(int));
        *p = va_arg(args, int);
        args_values[i] = p;
    } else if (!strcmp(arg, "float")) {
        float *p = malloc(sizeof(float));
        *p = va_arg(args, float);
        args_values[i] = p;
    } else {
        char *p = malloc(sizeof(char));
        *p = va_arg(args, char);
        args_values[i] = p;
    }
  }

这也意味着您需要知道其他地方这些值的类型,才能将指针转换为正确的类型,并且在使用完它后,您需要释放空间.

C++相关问答推荐

C sscanf没有捕获第二个参数

与unions 的未定义行为

找出文件是否包含给定的文件签名

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

GTK3按钮信号错误

我的C函数起作用了,但我不确定为什么

为 struct 中的数组动态分配内存时出错

S和查尔有什么不同[1]?

链接到底是如何工作的,我在这里到底做错了什么

在C++中允许使用字符作为宏参数

错误...的多个定义(&Q)首先在这里定义&

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

链接器脚本和C程序使用相同的头文件,这可能吗?

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

在吉陀罗中,_2_1_和CONCAT11是什么意思?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

按字典顺序打印具有给定字符的所有可能字符串

UpDown控制与预期相反

为什么创建局部变量的指针需要过程在堆栈上分配空间?