【问题标题】:How to access global variable in C source file from c++ source file如何从 C++ 源文件访问 C 源文件中的全局变量
【发布时间】:2023-08-17 22:27:01
【问题描述】:

有一个很大的C文件,里面定义了很多字符串,在本地使用。我想从 C++ 文件中访问这些字符串,但使用 extern "C" 没有帮助。

C 文件如下所示:data.c

#include <stdio.h>

static char* str = "string\n";

void p() {
   printf(str);
}

c++ 文件如下所示:

#include <iostream>

extern "C" {
   extern char* str;
   extern void p();
};

int main(int argc, char* argv[]) {
   p();
   std::cout << str;
   return 0;
}

我用的是VS2013,编译报错

error LNK2001: unresolved external symbol _str
fatal error LNK1120: 1 unresolved externals

调用C文件中定义的函数没有问题。

甚至可以从 C++ 访问 C 中的变量吗?以及如何正确做?

【问题讨论】:

  • 你不能。这是static
  • 更多关于静态here的信息。短版:static 在此上下文中使用将变量的可见性限制为当前“翻译单元”(大致是定义它的文件)。
  • @TigerHwang - 恐怕不行。很好,它没有,或者正确的封装是不可能的。
  • static 修饰符意味着您的意图是保持字段私有。如果团队的一名初级成员决定公开所有字段以便可以从任何地方访问它们,我肯定会生气。
  • 实际上要解决什么问题。告诉我们更多关于上下文的信息。这闻起来像 XY Problem

标签: c++ c static extern


【解决方案1】:

当您在文件中使用 static 关键字时。它表示以static为前缀的变量不能导出到另一个文件中。您可以将该变量保持为非静态变量,然后也可以在其他文件中访问这些变量。

您可以参考以下文章。 https://cboard.cprogramming.com/cplusplus-programming/102259-global-variable-access-c-cplusplus.html

【讨论】:

    【解决方案2】:

    在 C 中,static 语句暗示不应导出符号。

    因此,只需删除该关键字即可访问这些变量。

    This article 可能会帮助您更好地理解符号可见性概念

    除此之外,虽然 C 语言在使用损坏的 C++ 符号时可能会遇到问题,但相反的情况绝对不会造成兼容性问题。

    【讨论】:

    • 没有任何暗示——它非常明确;这正是它的用途。