C++中如何正确前置声明typedef定义的结构体?
问题解决:typedef结构体的前向声明冲突
你遇到的编译错误根源在于:遗留库的typedef struct { int i; int j; } Foo是匿名结构体的typedef,而你写的struct Foo;是声明了一个名为Foo的具名结构体——这两个在C++里是完全不同的实体,所以当cpp文件引入Foo.h时,编译器会判定为重复定义且类型不匹配。
正确的实现有两种方式:
方法1:匹配遗留库的typedef语法进行前向声明
在你的C++头文件里,把原来的struct Foo;替换成和库定义一致的typedef前向声明:
// 正确的前向声明,匹配遗留库的typedef结构 typedef struct Foo Foo; class Bar { void myFunction(std::shared_ptr<Foo> foo); };
这样前向声明的Foo和库中typedef struct {...} Foo的Foo就对应上了,cpp文件里#include "Foo.h"时不会再冲突。
方法2:直接在头文件中包含Foo.h(如果允许的话)
如果你的头文件不需要刻意隐藏Foo的定义(不担心编译依赖问题),可以直接去掉前向声明,改成包含库的头文件:
#include "Foo.h" #include <memory> class Bar { void myFunction(std::shared_ptr<Foo> foo); };
这种方式更直接,完全避免了前向声明的匹配问题。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

