C ++关于变量

时间:2014-09-06 17:00:33

标签: c++ variables header

我正在阅读一本c ++书籍(c ++入门书),现在有一件我无法弄清楚的事情 为什么如果我有2个不同的cpp文件并且我声明并在这些文件中定义了一个具有相同名称的变量,编译器会给出错误的链接?变量是变量本地的吗?

2 个答案:

答案 0 :(得分:1)

如果使用static关键字声明变量,它们将是相应编译单元的本地变量,并且您不会收到错误。否则它们是全局的,应该可以访问整个程序,因此会出现错误。

答案 1 :(得分:1)

变量是否为本地变量?否。

对于cpp文件而言,与h文件相比没有什么特别之处;当你编译cpp文件(比如,以标准方式,到.o)时,拉入h文件的#include只是将h文件注入编译流。这方面的头文件是组织实体。

您可以将int foo;放在一个cpp文件中,将extern int foo;放在另一个cpp文件中,将每个文件编译成目标文件并将它们链接在一起。然后,第二个文件可以访问第一个文件中的同一个对象(extern int foo;被推入cpp文件的事实真的不相关)。出于同样的原因,将int foo;置于两个不同的cpp文件中会在将它们链接在一起时产生歧义。

要确保一个翻译单元中的int foo(如果你愿意,编译.o / .obj文件)确实只被该单元使用,你可以做以下两件事之一:

  1. 将foo对象声明为static,如下所示:static int foo;此变量不受外部链接的影响;它真正属于一个翻译单位。
  2. 将int对象放在未命名的命名空间中,如下所示:

    namespace { // Foo is in a unique namespace for this object file int foo; }

  3. 此特殊构造为每个翻译单元生成唯一的命名空间。这会导致跨目标文件的每个foo对象都是不同的。

相关问题