混合C和C++全局变量

San*_*nto 4 c c++ global linkage

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

typedef struct MyStruct
{
  int x;
} MyStruct;

extern "C" MyStruct my_struct;
Run Code Online (Sandbox Code Playgroud)

以前,它只包含在C++源文件中.现在,我需要将它包含在C文件中.所以,我做了以下事情:

typedef struct MyStruct
{
  int x;
} MyStruct;

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
MyStruct my_struct;
#endif
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我接受了接受的答案的建议.在标题中,我有

typedef struct MyStruct
{
  int x;
} MyStruct;

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
extern MyStruct my_struct;
#endif
Run Code Online (Sandbox Code Playgroud)

在cpp源文件中,我有

extern "C" {MyStruct my_struct;}
Run Code Online (Sandbox Code Playgroud)

一切都在建立.

das*_*ght 9

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

#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
extern MyStruct my_struct;
#endif
Run Code Online (Sandbox Code Playgroud)

否则,您将my_struct在每个包含标题的翻译单元中定义多个定义,从而导致链接阶段出错.

my_struct应该定义在一个单独的翻译单元中 - C文件或CPP文件.标题也需要包含在内,以确保您获得正确的链接.