【问题标题】:Mixing C and C++ global variable混合 C 和 C++ 全局变量
【发布时间】:2013-08-15 19:17:14
【问题描述】:

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

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 链接,但这是否意味着如果我将此文件包含在 C 编译文件以及 CPP 编译文件中,链接器将确定我在最终链接的可执行文件中的意图, 我只想要一个 MyStruct 供 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;}

一切都在构建。

【问题讨论】:

    标签: c++ c global linkage


    【解决方案1】:

    由于这是头文件,你的 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 中?
    • @SanJacinto Globals 在 C++ 中的工作方式与在 C 中的工作方式相同,即需要声明和定义。声明有extern,并在标题中;它不会导致分配 - 它承诺将在其他地方进行分配。另一方面,该定义没有extern,而是在一个CPP 文件中。它是控制分配的定义:它需要发生在 CPP 文件中。
    • 啊,所以用 'extern "C"' 将我的定义包装在 cpp 源文件中是不是很糟糕?好的,谢谢!
    猜你喜欢
    • 2019-06-05
    • 2018-07-20
    • 2012-01-07
    • 2017-06-09
    • 1970-01-01
    • 2014-11-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多