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)
一切都在建立.
由于这是头文件,您的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文件.标题也需要包含在内,以确保您获得正确的链接.