4

在我的项目中,我们有一个类似于此的头文件:

typedef struct MyStruct
{
  int x;
} MyStruct;

extern "C" MyStruct my_struct;

以前,它只包含在 C++ 源文件中。现在,我需要将它包含在 C 文件中。因此,我执行以下操作:

typedef struct MyStruct
{
  int x;
} MyStruct;

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
MyStruct my_struct;
#endif

我知道 extern "C" 会将 my_struct 全局变量声明为 C 链接,但这是否意味着如果我将此文件包含在 C 编译文件和 CPP 编译文件中,链接器将确定我的意图在最终链接的可执行文件中,我只想要一个 MyStruct 供 C 和 CPP 文件使用?

编辑:

我已经接受了已接受答案的建议。在标题中,我有

typedef struct MyStruct
{
  int x;
} MyStruct;

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
extern MyStruct my_struct;
#endif

在cpp源文件中,我有

extern "C" {MyStruct my_struct;}

一切都在建立。

4

1 回答 1

9

由于这是头文件,你的 C 分支也应该使用extern

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
extern MyStruct my_struct;
#endif

否则,您最终会my_struct在包含标头的每个翻译单元中得到多个定义,从而导致链接阶段出现错误。

的定义my_struct应该驻留在单独的翻译单元中 - C 文件或 CPP 文件。还需要包含标题,以确保您获得正确的链接。

于 2013-08-15T19:19:15.407 回答