2014-09-06 78 views
1

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

+2

你能提供一个例子吗? – 2014-09-06 17:09:30

回答

1

变量本地文件?编号

与h文件相反,cpp文件没有特别的特别之处;当你编译一个cpp文件(比如说,以标准的方式,到一个.o)时,引入h文件的#include只是简单地将h文件注入到编译流中。这方面的头文件是组织实体。

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

为了确保INT FOO在一个转换单元(编译的.o/obj文件,如果你会)真的只由单位,你可以做两件事情之一:

  1. 声明foo对象是静态的,如下所示:static int foo;这个变量不受外部链接影响;它对一个翻译单位来说是真正的私人。
  2. 把int对象在具名命名空间,如下所示:

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

这种特殊的构建体产生用于每个转换单元唯一的命名空间。这会导致跨目标文件的每个foo对象都是不同的。

+0

谢谢!很好的解释。所以.h文件的目的是告诉编译器哪些方法/函数/其他东西在其他.cpp中,然后让你在你想要的任何.cpp中使用它们,对吧? – 2014-09-06 19:32:55

+0

不完全。 cpp中的代码和h中的代码看起来与编译器相同,并且处理方式相同。 h文件仍然是你放置共同实体的地方;在这种情况下,声明 - 'extern int foo;'。这样,任何想在您的cpp文件中使用int的人都可以#包含您的h文件,并将'extern int foo;'注入到它们的代码中。这是为了您的利益,而不是编译器。 – 2014-09-06 19:46:37

1

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