混合C和C ++全局变量

时间:2013-08-15 19:17:14

标签: c++ c global linkage

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

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

我理解     外部“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

在cpp源文件中,我有

extern "C" {MyStruct my_struct;}

一切都在建立。

1 个答案:

答案 0 :(得分:9)

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

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

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

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