C++ 从 .CPP 文件访问变量

标签 c++ static namespaces extern

我不太清楚 .cpp 文件之间的变量访问是如何工作的。例如:

main.cpp

int main()
{
    int a = i;
    return 0;
}

main2.cpp

int i;

这会在 main.cpp 上生成编译器错误,告诉我不存在 i 中。那么,“static”关键字在这种情况下有什么区别呢? (我尝试用谷歌搜索,但大多数“静态关键字”信息页面都在谈论类和函数)

main2.cpp

static int i;

是一样的吗?它会阻止 extern int i 被用来访问别处的 i 吗?匿名命名空间的使用在处理变量方面有何不同?

main2.cpp

namespace
{
    int i;
}

总结:

  • .cpp 文件之间可以访问变量吗? (除了 extern 关键字)
  • 全局变量上的 static 关键字有何影响?
  • 匿名命名空间如何影响事物?

最佳答案

在您的第一个示例中,main2.cpp 定义了一个全局变量 i本可以main.cpp 访问 如果 iextern 声明出现在该文件中。 (通常 extern 声明来自头文件。)您遇到编译器错误,因为 i 从未在 main.cpp 中声明,这意味着编译器假定存在没有这样的变量。

在您的第二个示例中,main2.cpp 定义了一个文件范围 变量i。文件作用域变量不同于全局变量,即使它们恰好具有相同的名称。如果您在第二个示例中的 main.cpp 中有一个 i 的外部声明,那么这两个文件都会成功编译,但是您会出现链接错误,因为未定义全局 变量i

如果您将第二个示例中的 main2.cpp 重命名为 main3.cpp,则将 i 的外部声明添加到 main .cpp,把这三个都编译出来,然后全部链接起来,就成功了; main.cpp 和 main2.cpp 将共享一个名为 i 的变量,而 main3.cpp 将拥有自己的完全独立 变量,该变量也名为 >我

这东西叫做链接。命名空间几乎与链接完全无关。然而,匿名命名空间是特殊的。在匿名命名空间中定义变量出于所有实际目的与使用static 定义它相同——它使它成为一个文件范围变量。 (如果我没记错的话,是有区别的,但只有当你用导出的模板做复杂的事情时才重要,而且导出的模板很少使用,他们正在谈论从 C++ 标准中删除这个特性,你不不必担心。)

匿名命名空间的值(value)在于您可以在其中放置一个类定义,这使得该类的所有方法都是文件本地的。 (只有 class { ... } block 必须位于 namespace { ... } block 内才能获得此效果。)您不能这样做方式。

关于C++ 从 .CPP 文件访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3662119/

相关文章:

c# - 静态类中没有静态嵌套类 C#

c++ - tcp 缓冲区中的多个消息

c++ - 使用 Visual C++ 2010 嵌入 v8

c++ - GCC模板参数模板

PHP遍历dbpedia xml

c# - 为什么命名空间/导入在 c# 和 Razor 之间的工作方式不同?

ruby-on-rails - 同名类

c++ - 保留名称和用户文字

qt - 需要帮助在 Windows 上的 Qt Creator 中链接静态 OpenCV 库

c++ - 如何在多个类中传递一个静态对象?