在我的项目中,我们有一个类似于此的头文件:
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;}
一切都在建立。
答案 0 :(得分:9)
由于这是头文件,因此您的C分支也应使用extern
:
#ifdef __cplusplus
extern "C" MyStruct my_struct;
#else
extern MyStruct my_struct;
#endif
否则,在包含标题的每个翻译单元中,您最终会得到my_struct
的多个定义,从而导致链接阶段出错。
my_struct
的定义应该位于单独的翻译单元中 - C文件或CPP文件。还需要包含标题,以确保您获得正确的链接。