混合使用C和C++全局变量

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编译文件中都包含此文件,链接器会确定我的意图,在最终链接的可执行文件中,我只想让C和CPP文件共用一个MyStruct?
编辑:
我已经采纳了被接受的答案的建议。在头文件中,我有:
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个回答

9

既然这是头文件,那么你的C分支也应该使用extern

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

否则,每当包含该头文件的翻译单元都会出现多个my_struct的定义,导致连接阶段出现错误。 my_struct的定义应该放在单独的翻译单元中,可以是C文件或CPP文件。同时需要包含头文件,以确保获得正确的链接。

嗨。我已经更新了我的问题,以反映您对我的代码所做的更改。在C语言中,如果我在头文件中声明my_struct为extern,那么在链接时,只要我在非头文件源文件中添加了一个相同类型和名称的非静态变量,它就会在编译后的目标文件中找到该变量。那么在C++中,这是如何工作的呢?在头文件中使用'extern "C"'与在源文件中使用有什么不同?在cpp翻译中,实际分配变量的行是从哪一行开始的?是在头文件中还是在cpp文件中? - San Jacinto
@SanJacinto 在C++中,全局变量和C中一样工作,也就是说需要有声明和定义。声明使用extern,放在头文件中;它不会导致分配 - 它承诺将在其他地方进行分配。另一方面,定义没有extern,并且放置在其中一个CPP文件中。它是控制分配的定义:需要在CPP文件中发生分配。 - Sergey Kalinichenko
啊,那么在cpp源文件中用'extern "C"'包装我的定义是不好的形式?好的,谢谢! - San Jacinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接