【问题标题】:incompatible types when initializing type 'int' using type使用类型初始化类型“int”时不兼容的类型
【发布时间】:2015-02-19 19:35:10
【问题描述】:

这是我正在尝试做的最小测试用例;

// minimal test case
#include <stdlib.h>

struct array {
    void *ptr;
    int numElements;
    int capacity;
};

struct task {
    char *task_name;
    int task_id;
};

#define NEW_ARRAY(TYPE, VARIABLE, CAPACITY) \
    struct array VARIABLE; \
    VARIABLE.ptr = malloc(CAPACITY * sizeof(TYPE)); \
    VARIABLE.capacity = CAPACITY; \
    VARIABLE.numElements = 0 \

#define array_for_each(TYPE, ELEM, ARRAY) \
    for (int i=0, ELEM = *((TYPE *)ARRAY.ptr); \
        i<ARRAY.numElements; \
        i++, ELEM = *((TYPE *)ARRAY.ptr + i) \
    ) \

int main() {
    NEW_ARRAY(struct task, my_tasks, 2);
    struct task tmp;

    array_for_each(struct task, tmp, my_tasks) {
        ;
    }

    return 0;
}

我得到了;

test.c:22:23: hata: 初始化类型“int”时不兼容的类型 使用类型 'struct task' for (int i=0, ELEM = *((TYPE *)ARRAY.ptr); \

那个宏行展开后变成这样:

for (int i=0, tmp = *((struct task *)my_tasks.ptr); i<my_tasks.numElements; i++, tmp = *((struct task *)my_tasks.ptr + i) ) {
  ;
 }

好的,所以 tmp 是一个 struct task,我将 my_tasks.ptr 这是一个 void * 转换为 struct task * 并取消引用它,所以应该给我一个 struct task。所以我不知道为什么 gcc 会抛出这个错误。

【问题讨论】:

  • 因为您随后将struct task 分配给int 类型的变量?

标签: c


【解决方案1】:

当你有这样的代码时:

for (int i=0, tmp = *((struct task *)my_tasks.ptr); ...

tmpfor循环范围内的一个新变量,它的类型是int

【讨论】:

    【解决方案2】:

    在如下声明中:

    int i = 0, tmp = ....;
    

    它声明ints 称为itmp。但是您尝试使用 struct task 初始化这个新的 int tmp

    我猜您试图将声明 int i = 0; 与引用现有变量 tmp 的声明 tmp = .... 结合起来,但这是不可能的。要解决此问题,您可以将 ELEM= 部分提升到 for( 之前。

    顺便说一句,考虑使循环使用指针而不是按值复制每个元素,然后您可以修改数组中的值。这种方法的好处是你甚至不需要i。 (您可以使用指针减法来知道何时到达循环的末尾)这样您根本不会遇到原始问题。

    【讨论】:

      【解决方案3】:

      for 循环有两种不同的有效语法。它可以是:

      for (expr_opt1 ; expr_opt2 ; expr_opt3)
      

      for (declartion expr_opt1 ; expr_opt2)
      

      您试图通过在循环范围内声明一个新变量 i 并尝试初始化 tmp 来混合两者。编译器认为您正在尝试声明 TWO 个新变量 i 和 tmp,它们都是 int 类型,具有循环范围,然后使用 struct 任务初始化 tmp。后一点是为什么会有错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 2015-01-13
        相关资源
        最近更新 更多