我有以下代码在编译 x.cpp
时抛出编译错误(conflicting declaration 'typedef struct THE_TYPE_STRUCT THE_TYPE'
,在 y.h 的最后一行
, g++ 5.3.0):
// x.h file
struct THE_TYPE;
class C{
THE_TYPE * t;
};
// x.cpp file
#include "x.h"
extern "C"{
#include "y.h"
}
// y.h file
struct THE_TYPE_STRUCT {
int x;
};
typedef struct THE_TYPE_STRUCT THE_TYPE;
文件y.h
是一个C头文件,不能包含在头文件x.h
开头,因为和其他头文件名字冲突,所以只好做一个THE_TYPE
的前向定义。似乎不完全正确。 我该如何正确操作?
最佳答案
C 与 C++ 不同并且具有不同的规则(例如,typedef struct THE_TYPE THE_TYPE;
在 C++ 中是无用的 - 因为隐式 - 但在 C 中有意义)。
您应该生成预处理形式(例如使用 g++ -C -E x.cpp > x.ii
)然后研究它。一个可能的技巧是通过运行
g++ -C -E x.cpp | 删除行信息(以
然后使用 #
开头)。 grep -v '^#' > x.iig++ -Wall -c x.ii
重新编译并查看 x.ii
中的错误位置
在不知道涉及的实际文件的情况下,我们无法提供帮助(例如,也许某些文件有一些 #define THE_TYPE
)。
How do I do it properly?
在 C++ 中,您可能会使用 namespace
-s(特别是在您自己的文件中)并避免使用宏。
在 C 中,您可能应该编辑您的文件,我建议在您自己的代码中为每个公共(public)名称添加一个公共(public)前缀。您可能会从 GTK 中获得灵感其中每个名称都以 Gtk
或 GTK
或 _GTK
等开头...
一般来说,您需要一些一致的命名约定,并且您可能需要编辑所有您的文件。
关于c++ - C 的 C++ 文件中的正确前向定义包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44082752/