首先利用一个最简单的工程重现了该问题
文件 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; ,但是不能同时出现两个结构定义。