认清事物的本质-简单

博客园 首页 新随笔 联系 订阅 管理

首先利用一个最简单的工程重现了该问题

文件 MInfo.h

内容如下:

源代码


 

文件 pubdef.h

内容如下:

源代码

文件 funtest.c

源代码

编译该工程,提示错误 error C2011: 'MIMainInfo' : 'struct' type redefinition

 

解决方法1:

去除文件 pubdef.h中的头文件,编译通过,执行通过

解决方法2:

去除文件 funtest.c中的头文件 #include "MInfo.h" ,编译通过,执行通过

解决方法3:

去除文件 funtest.c中的头文件 #include "pubdef.h" ,编译通过,执行通过

解决方法4:

文件 MInfo.h添加代码

源代码

编译通过,执行通过。

 

问题分析:

首先可以看一个详细解释的链接http://en.wikipedia.org/wiki/Pragma_once

自己的想法:

     编译无法通过是在文件 funtest.c中,因为头文件包含了MIMainInfo的原始定义和通过typedef关键字实现的定义,两个定义自然会出现重复定义的错误。上面的链接中的例子是通过函数的重复定义说明的,只是简单的包含了两次头文件就出现了重复定义的错误。

解决方法1、2和3会导致c文件中只包含了一个定义,自然可以解决问题,方法4通过检查重复包含,使得最后文件中包含了一个定义,也解决了问题。

总结:一个文件中只能可以同时出现多个 typedef struct MIMainInfo MIMainInfo;  ,但是不能同时出现两个结构定义。

posted on 2010-09-19 12:23  萧冲  阅读(3535)  评论(0编辑  收藏  举报