c++ - C 的 C++ 文件中的正确前向定义包括

标签 c++ c

我有以下代码在编译 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.ii 然后使用 g++ -Wall -c x.ii 重新编译并查看 x.ii 中的错误位置

在不知道涉及的实际文件的情况下,我们无法提供帮助(例如,也许某些文件有一些 #define THE_TYPE)。

How do I do it properly?

在 C++ 中,您可能会使用 namespace-s(特别是在您自己的文件中)并避免使用宏。

在 C 中,您可能应该编辑您的文件,我建议在您自己的代码中为每个公共(public)名称添加一个公共(public)前缀。您可能会从 GTK 中获得灵感其中每个名称都以 GtkGTK_GTK 等开头...

一般来说,您需要一些一致的命名约定,并且您可能需要编辑所有您的文件。

关于c++ - C 的 C++ 文件中的正确前向定义包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44082752/

相关文章:

c++ - 使用非静态成员变量的静态变量初始化

c++ - 在 LuaSQL 代码上断言 C/C++

C++提取多项式系数

C11_Generic 将 true 和 false 推导为整数

mysql - snprintf 截断最后一个符号

c - 在 C 中,使用同一结构内的另一个值设置结构内数组的大小

c - gcc 由于无法识别 __TIMESTAMP__ 和其他一些已定义的构建变量而生成编译时错误

c++ - 如何在 Qt 中调整像素图的大小?

c++ - boost 记录器,多个日志文件和记录器

c - 如何在 C 语言中更改来自 NIC 的传入数据包?