解决编译错误: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 <stdio.h>
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); }

时间: 2024-10-06 13:42:37

解决编译错误:dereferencing pointer to incomplete type 的办法的相关文章

gcc: dereferencing pointer to incomplete type错误

/*********************************************************************  * Author  : Samson  * Date    : 07/27/2014  * Test platform:  *              Mint 15  *              GNU bash, version 4.2.45  * *************************************************

关于编译报错“dereferencing pointer to incomplete type...

今天同事问了我一个问题,他make的时候报错,“第201行:dereferencing pointer to incomplete type”,我随即查阅了很多资料,也没看出个所以然.最后问题得到了解决,也懂得了原理,遂记录一下. 他的问题具体是这样. ? 1 2 3 4 5 6 #include <netinet/ip_icmp.h> ... struct icmp* aaa;     aaa = (struct icmp*)malloc(sizeof(struct icmp)); //假设

Redhat编译php-5.2.9出现error dereferencing pointer to incomplete type

错误1: /usr/src/php-5.2.9/ext/dom/node.c:In function 'dom_canonicalization': /usr/src/php-5.2.9/ext/dom/node.c:1950:21: error: dereferencingpointer to incomplete type ret = buf->buffer->use; ^ Infile included from /usr/src/php-5.2.9/main/php.h:38:0, f

linux dereferencing pointer to incomplete type错误

修改内核时,make uImage 时遇到这么一个错误: "dereferencing pointer to incomplete type" 该错误的解释是:你的指针,有一个类型,这个类型是不完全的.也就是说,我们只给出了 这个类型的声明,没有给出其定义.这里的类型多半是结构,联合之类的东西. 这个错误其实是因为某结构体或联合的字段名所指的变量定义的头文件没有引入到当前C代 码中而造成的错误,只要找到出错对应的变量的结构体或联合的定义的头文件,并把这些头 文件包含进来即可解决此问题.

Java,AWTUtilities,eclipse报编译错误:Access restriction: The type &#39;AWTUtilities&#39; is not API (restriction on required library &#39;C:\Program Files\Java\jre7\lib\rt.jar&#39;)

[场景]调用com.sun.awt.AWTUtilities时,eclipse提示编译错误: Access restriction: The type 'AWTUtilities' is not API (restriction on required library 'C:\Program Files\Java\jre7\lib\rt.jar') [分析]eclipse项目默认的jre版本较早. com.sun.awt.AWTUtilities是在JDK 6 update10中增加的. [解决

解决编译错误 implicit declaration of function &#39;strptime&#39;

根据man手册,在文件中加上以下定义,应该可以去处该warning #define _XOPEN_SOURCE /* glibc2 needs this */ #include 但不起作用(重新编译还是有该warning) 加上编译选项-D_XOPEN_SOURCE又出现一大推其他编译错误 最后在找到这篇帖子 http://stackoverflow.com/questions/15334558/compiler-gets-warnings-when-using-strptime-functio

程序编译是出现&quot;field has incomplete type&quot;问题的解决

在编译程序是出现了如下错误, 类或结构体的前向声明只能用来定义指针对象或引用,因为编译到这里时还没有发现定义,不知道该类或者结构的内部成员,没有办法具体的构造一个对象,所以会报错. 将类成员改成指针就好了. 程序中使用incomplete type实现前置声明有助与实现数据的隐藏.要求调用对象的程序段只能使用声明对象的引用或者指针. 在显式声明异常规范的时候不能使用incomplete type.

Intellij Idea 解决编译错误 偶发问题的办法

在使用Intellij Idea的时候,也会偶尔出现Eclipse中不可预知的编译错误. 这种错误不是由于JDK配置错误导致的,即使删除JDK配置,重新配置JDK,仍然会出现编译错误的问题. 这个时候可以尝试清空Intellij Idea的缓存,操作方法:File->Invalidate Caches/Restart, 点击后会提示几个按钮供选择,选择nvalidate Caches and Restart即可.

解决编译错误:cc: Internal error: Killed (program cc1)

错误现象: cc: Internal error: Killed (program cc1) ... 大体上是因为内存不足,临时使用交换分区来解决吧 sudo dd if=/dev/zero of=/swapfile bs=64M count=16 sudo mkswap /swapfile sudo swapon /swapfile 编译完成,可以取消交换分区: sudo swapoff /swapfile sudo rm /swapfile 参考:https://gcc.gnu.org/bu