解决编译错误:dereferencing pointer to incomplete type 的办法

在使用c语言写程序时,可能遇到错误:error :dereferencing pointer to incomplete type。其实,这个错误是指针指向的结构体类型没有定义。

原因可能有很多,但最多情况可能下面两种:

1,使用库函数或内核等提供的结构体时,没有包含相应的头文件。解决方法很简单,就是包含对应头文件就ok了。

2,若是自己定义的结构体,而且这个结构体恰恰是定义在.c文件中。在这种情况下,在其他.c文件中使用该结构体指针时,也会出现类似错误。


就第二种情况,笔者找到两种解决方法:

1,将结构体定义放到.h文件中,然后在使用该结构体的.c文件中分别包含这个文件。这种方法较符合常规。

在这里需要注意,在定义头文件时,要使用预编译语句将头文件包围起来。这样做是防止出现头文件被重复包含的错误。

例如:

#ifndef  _ABC_H

#define _ABC_H

结构体定义

#endif


2,将结构体定义从上一个.c文件中拷至出错的.c文件中,因为结构体定义只是声明了结构体的大小并不真实分配空间,所以这样做不会有问题。

示例代码:

a.c

#include

struct obj_t {
int x;
int y;
};

struct obj_t obj;

struct obj_t * get_obj()
{
obj.x = 11;
obj.y = 22;

return &obj;
}


void show(struct obj_t *p)
{
printf("a=%d\nb=%d\n", p->x, p->y, __func__);
}

b.c

void call_show()

{
struct obj_t *p = get_obj();

p->x = 111;
p->y = 222;

show(p);
}


main.c

int main(int argc, char **argv)
{
call_show();
}

执行命令:gcc a.c b.c main.c -o test

出现如下错误:

b.c: In function ‘call_show’:
b.c:10: warning: initialization makes pointer from integer without a cast
b.c:12: error: dereferencing pointer to incomplete type
b.c:13: error: dereferencing pointer to incomplete tyd;"


如下修改b.c后,错误消失

struct obj_t {
int x;
int y;
};

void call_show()
{
struct obj_t *p = get_obj();

p->x = 111;
p->y = 222;

show(p);
}


你可能感兴趣的:(C语言编程学习)