繁体   English   中英

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

[英]C++ accessing variables from .CPP files

关于.cpp文件之间的变量访问如何工作,我有点模糊。 例如:

main.cpp中

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

main2.cpp

int i;

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

main2.cpp

static int i;

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

main2.cpp

namespace
{
    int i;
}

总结一下:

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

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

在第二个示例中, main2.cpp定义了一个文件范围变量i 文件范围变量与全局变量不同,即使它们碰巧具有相同的名称。 如果你曾经有过的外部声明imain.cpp在第二个例子中,这两个文件将会成功编译 ,但你会得到,因为没有全局变量链接错误i的定义。

如果你将main2.cpp从第二个例子重命名为main2.cppmain3.cpp一个extern声明的i添加到main.cpp ,编译所有三个并将它们全部链接在一起,这将成功; main.cpp和main2.cpp将共享一个名为i变量,而main3.cpp将拥有自己的完全独立的变量,也称为i

这个东西叫做联系 命名空间几乎完全与链接无关。 但是,匿名命名空间是特殊的。 在匿名命名空间中定义变量用于所有实际目的与使用static定义变量相同 - 它使其成为文件范围变量。 (如果我没记错的话,那就有区别,但只有你使用导出的模板做复杂的事情才有意义,并且由于导出的模板使用得很少,以至于他们正在谈论从C ++标准中删除该功能,所以你不要不得不担心它。)

匿名命名空间的值是你可以在其中放置一个类定义 ,这使得所有类的方法都是文件本地的。 (只有class { ... }块必须在namespace { ... }块内才能获得此效果。)您不能以任何其他方式执行此操作。

所有全局变量都有某种联系 extern链接需要在不同文件之间的不同上下文中命名相同的变量。

extern是默认值。 如果您在变量声明中实际使用extern ,则将其视为对另一个文件的引用。 省略任何链接说明符以实际创建变量; 这必须只在一个文件中发生。

extern int i; // i exists somewhere in some .cpp file.
int i; // ah! this is the file it exists in. 
       // (Although nothing special about that.)

应用于全局的static (在命名空间范围内)使其成为文件的本地。 您从私有名称空间获得相同的效果,因此不推荐使用static外部函数或类作用域。 许多人仍然使用它。

static意义文件本地规则的例外是在类和inline函数中。 由于语义相同,因此应该更恰当地将类static成员称为extern 它很丑陋而令人困惑,但我猜Bjarne只想将extern作为关键词消除。

内联函数可以在多个.cpp文件中具有相同的定义,因此当创建static变量时,也会共享变量定义。

  • 是的,例如,您可以使用静态类变量
  • 它使变量本地和持久的编译单元
  • 匿名命名空间可防止符号之间的冲突 就像您手动创建唯一命名的命名空间一样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM