关于编译报错“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)); //假设是第200行; aaa->icmp_type=1; //假设是201行;... |
make的时候第201行报错:dereferencing pointer to incomplete type。
首先说一下这个报错的意思,通俗的说就是,试图访问该pointer指向的变量,却发现该变量是一个不完整的类型,多出错于访问结构体联合体的成员。从代码中可看出来,是从201行开始才真正的访问icmp_type指向的变量,200行还没访问。
于是我就猜想,是不是struct icmp没有定义呢?遂粗略的查看了/usr/include/netinet/ip_icmp.h文件,发现有struct icmp的定义。很奇怪,不是吗?经过写了一些demo测试,最终的结论是,确实没有struct icmp的定义!
看到这里,更奇怪了。为什么是这样的结论呢?细看/usr/include/netinet/ip_icmp.h文件,会发现struct icmp的定义被包含在一个宏里面j,如下面所示:
|
1
2
3
4
5
6
7
8
9
|
...#ifdef __USE_BSD...struct icmp {...}...#endif /*END OF ifdef __USE_BSD*/... |
看到这里应该就明白了,编译的时候,如果编译命令 gcc ...里面没有加入 -D__USE_BSD的话,那么struct icmp的定义是不会被include进来的,所以就导致了前面的第201行报错:dereferencing pointer to incomplete type,也就是这样导致我开始一直想不明白,明明有定义,为何却说是不完整的类型。于是为了验证这个结论,我写了一个小demo来测试,发现加 -D__USE_BSD就编译通过,否则就编译不通过。
在解决这个问题的过程中,我写了不少demo,,下面总结一下。
1.如果报错“dereferencing pointer to incomplete type”, 先试图找一下该行的那个结构体变量的定义是否能找到,可使用grep "struct xxx" /usr/include -R命令递归搜索/usr/include目录,如找到,可在.c文件中#include,如果是非标准头文件就要在编译命令中加入-I头文件目录,例如 (-I/usr/local/xxx/include)。
2.如果#include之后仍然报错“dereferencing pointer to incomplete type”,试图仔细查看该文件,查看该结构体的定义是否被某个编译宏给包裹了,如果确实处于某个编译宏的包裹内,在编译命令里面增加 -D编译宏(如-D__USE_BSD)
经过上面两个步骤以后,基本上能解决“dereferencing pointer to incomplete type”报错了
转自:http://my.oschina.net/michaelyuanyuan/blog/68203?fromerr=quiozj2B
关于编译报错“dereferencing pointer to incomplete type...的更多相关文章
- 编译报错dereferencing pointer to incomplete type
关于编译报错“dereferencing pointer to incomplete type... 多是没找到结构体的定义,可以在本地复制其定义试试. 参考: http://my.oschina.n ...
- error: dereferencing pointer to incomplete type
/******************************************************************************* * error: dereferenc ...
- 使用C#模拟Outlook发送邮件,代码编译报错
添加OutLook API using OutLook = Microsoft.Office.Interop.Outlook; 发送邮件方法 public void SendEmail() { Out ...
- cordova编译报错:Execution failed for task ':processDebugResources'
cordova编译报错:Execution failed for task ':processDebugResources' 引发这个错误的最扩祸首就是一个中文命名的文件,不知道什么时候加入的,我写了 ...
- Maven-010-maven 编译报错:Failure to ... in ... was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced.
今晚在编译 maven 项目的时候,命令行报错,出现 Failure to ... in ... 类似错误,详细的错误信息如下所示: [INFO] -------------------------- ...
- [Intellij] 编译报错 javacTask
报错信息: Idea 编译报错 javacTask: 源发行版 1.6 需要目标发行版 1.6 解决方案:
- jenkis编译报错:需要class,interface或enum
现象: 1.jenkis编译报错:需要class,interface或enum 2.使用ant进行编译ok. 解决方法: 1. Jenkis重新编译一个以前成功的svn版本,直至编译成功. 2.Jen ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- xocde7下导入libsqlite3.tbd编译报错的解决办法
在xocde7下没有libsqlite3.dylib,只有libsqlite3.tbd,然后我导入了tbd.编译报错error: /Applications/Xcode.app/Contents/De ...
随机推荐
- java时间类型的转换/获取当前时间/将时间转换成String/将String转换成时间
对于我的脑子,我已经服气了...写了N遍的东西,就是记不住...既然记不住那就记下来... 利用java获取当前的时间(String类型,年-月-日 时:分:秒) //我要获取当前的日期 Date d ...
- DOM hash
前段时间做的一个H5专题,用到了hash解决问题,特意记录一下.DOM hash的详细内容可以点击链接查看. hash就是uri中#及后面的部分,例如:www.google.com.hk#123的#1 ...
- C#快捷键
home:光标所在这一行的最前面 end:光标所在这一行的最后面 pg up:光标所在这一页最前一行的前面 pg dn:光标所在这一页最后一行的最后 shift+home:光标所在这一行之前的所有代码 ...
- hashmap 的作用
就是一个键值对应的集合HashMap a = new HashMap(); a.put("name", "abcdef"); // key是name,value ...
- js 在页面上模拟多选,蚂蚁线线框
<html> <head></head> <style> body{padding-top:50px;padding-left:100px;paddin ...
- (转载)数据库出现ORA-00283/ORA-01610的问题
在这里需要感谢棉花糖给予无私帮助,真的谢谢他!http://blog.itpub.net/67668/viewspace-353270/处理过程可以参照http://www.itpub.net/vie ...
- 【Delphi7】 解决“程序第一次可以正常编译,但再次编译的时候会报错,必须重新打开Delphi”的问题
报错如下: Access violation at address 00495044 in module 'coreide70.bpl'. Read of address...Access viola ...
- 大家把做的公祭日的ps上传哦
上传时图片保存为JPG,写上自己的学号,说说自己的创作构思
- jquery笔记之属性选择器 查找以某种条件开头的页面元素
jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...
- parseInt方法——将字符串解析为int值
parseXxx()方法 语法:static int parseInt(String s) 返回字符串的十进制整数形式 static int parseInt(String s, int rad ...