我正在尝试在代码中包含一个由某些编译器自动生成的(.h)头文件。下面是自动生成的头文件中的代码片段。
typedef struct SequenceOfUint8 { // Line 69
struct SequenceOfUint8 *next;
Uint8 value;
} *SequenceOfUint8; // Line 72
如果我将此头文件包含在C代码(gcc编译器)中,则可以正常编译而没有任何错误,但是,如果尝试将其包含在CPP代码中,则g ++编译器将抛出以下提到的错误。
In file included from ssme/src/../include/xxxxx.h:39:0,
from ssme/src/ssme.cpp:11:
ssme/src/../include/yyyyy.h:72:4: error: conflicting declaration ‘typedef struct SequenceOfUint8* SequenceOfUint8’
} *SequenceOfUint8;
^~~~~~~~~~~~~~~
ssme/src/../include/yyyyy.h:69:16: note: previous declaration as ‘struct SequenceOfUint8’
typedef struct SequenceOfUint8 {
^~~~~~~~~~~~~~~
有人可以告诉我如何在C ++代码中使用它(如果可能的话,不更改自动生成的代码)。
PS:我使用extern "C" { #include "yyyy.h" }
语句将头文件包含在CPP文件中,仍然没有运气。
答案 0 :(得分:6)
您不能像在C ++代码中那样使用它。这是另一个实例,其中C和C ++是两种不同语言。
C中的标记名称空间是独立的,而在C ++中则不是。确切地说,它甚至在C ++中都不存在。
extern "C"
中的包装也不会使C ++编译器将标头视为C代码。那不是预期的功能。标头必须是独立的有效C ++,而实际上不是。
您将需要编写一个C包装程序,以公开与C ++兼容的API。
答案 1 :(得分:2)
免责声明:使用此答案的风险自负。我不是你妈妈。
假设:
typedef
的其他用途
// <Your lenghty apologetic comment here>
#define typedef static
#include <generated.h>
#undef typedef
这将用typedef
变量替换所有static
,这些变量可以隐藏类型。请注意,稍后您将需要使用详细的类型名称struct SequenceOfUint8
来引用同一文件中的类型。
答案 2 :(得分:1)
更多的是评论而不是答案,但作为评论不切实际
可惜,如果您使用的是C ++,只需将其替换为
struct SequenceOfUint8 { // Line 69
SequenceOfUint8 *next;
Uint8 value;
};
否则,在C语言中照常使用 typedef ,但不要为SequenceOfUint8 *
制作 typedef ,而使 typedef 隐藏指针对于代码的可读性来说是灾难性的,在您的情况下,这是最糟糕的,因为名称是相同的