【发布时间】:2017-04-04 07:56:01
【问题描述】:
编译并执行以下sn-p:
#include <stdlib.h>
typedef struct {
int count;
struct lval **cell;
} lval;
lval *lval_new(void) {
lval *v = malloc(sizeof(lval));
v->cell = NULL;
return v;
}
lval *lval_add(lval *x, lval *y) {
x->count++;
x->cell = realloc(x->cell, sizeof(lval *) * x->count);
x->cell[x->count - 1] = y;
return x;
}
int main() {
lval *x = NULL;
x = lval_new();
x = lval_add(x, lval_new());
}
在 gcc 下会产生如下警告:
foo.c:16:31: warning: incompatible pointer types assigning to 'struct lval *' from 'lval *' [-Wincompatible-pointer-types]
x->cell[x->count - 1] = y;
修改lval_add的代码并在y上添加(struct lval*)转换如下:
lval *lval_add(lval *x, lval *y) {
x->count++;
x->cell = realloc(x->cell, sizeof(lval *) * x->count);
x->cell[x->count - 1] = (struct lval *) y;
return x;
}
修正了这个警告。
这对我来说感觉很不自然(免责声明:我不是一个熟练的 C 程序员),我必须添加几个强制转换来修复我的程序中的这些警告。
有没有更好的方法来声明lval 结构,这样它就不会产生这些警告?
【问题讨论】:
-
你确定这是代码吗?我认为您的结构声明有问题,或者您正在省略代码。
-
struct lval与lval是不同的类型 -
@M.M 我们在这里看不到任何
struct lval,对吗? :) -
@SouravGhosh 我们看到 1 或 2