我正在阅读一本c ++书籍(c ++入门书),现在有一件我无法弄清楚的事情 为什么如果我有2个不同的cpp文件并且我声明并在这些文件中定义了一个具有相同名称的变量,编译器会给出错误的链接?变量是变量本地的吗?
答案 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文件)确实只被该单元使用,你可以做以下两件事之一:
static int foo;
此变量不受外部链接的影响;它真正属于一个翻译单位。将int对象放在未命名的命名空间中,如下所示:
namespace {
// Foo is in a unique namespace for this object file
int foo;
}
此特殊构造为每个翻译单元生成唯一的命名空间。这会导致跨目标文件的每个foo对象都是不同的。