在C ++

时间:2019-02-22 12:26:36

标签: c++ pointers typedef

我正在尝试在代码中包含一个由某些编译器自动生成的(.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文件中,仍然没有运气。

3 个答案:

答案 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 隐藏指针对于代码的可读性来说是灾难性的,在您的情况下,这是最糟糕的,因为名称是相同的