如何从 C++ 源文件访问 C 源文件中的全局变量

Posted

技术标签:

【中文标题】如何从 C++ 源文件访问 C 源文件中的全局变量【英文标题】:How to access global variable in C source file from c++ source file 【发布时间】:2017-10-25 08:15:57 【问题描述】:

有一个很大的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。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

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

以上是关于如何从 C++ 源文件访问 C 源文件中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

从 C 中的另一个文件访问全局静态变量

如何访问 C 中的阴影全局变量?

全局变量怎么定义

C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]

C++ 错误:尝试访问全局变量时变量未命名类型

C++中的静态全局变量