C++;关于变量 我正在读一本C++的书(C++底漆),现在有一件事我弄不明白。 为什么如果我有两个不同的cpp文件,并且我在这些文件中声明并定义了一个同名变量,编译器会给我一个链接错误?变量是否是文件的本地变量?
如果使用C++;关于变量 我正在读一本C++的书(C++底漆),现在有一件事我弄不明白。 为什么如果我有两个不同的cpp文件,并且我在这些文件中声明并定义了一个同名变量,编译器会给我一个链接错误?变量是否是文件的本地变量?,c++,variables,header,C++,Variables,Header,如果使用static关键字声明变量,它们将是相应编译单元的本地变量,并且不会收到错误。否则,它们是全局的,应该可以对整个程序进行访问,因此会出现错误。这些变量是文件的局部变量吗?没有 与h文件相比,cpp文件没有什么特别之处;当编译cpp文件时(比如,以标准方式编译为a.o),拉入h文件的#include只是将h文件注入编译流。这方面的头文件是组织实体 你可以把intfoo和extern int foo
static
关键字声明变量,它们将是相应编译单元的本地变量,并且不会收到错误。否则,它们是全局的,应该可以对整个程序进行访问,因此会出现错误。这些变量是文件的局部变量吗?没有
与h文件相比,cpp文件没有什么特别之处;当编译cpp文件时(比如,以标准方式编译为a.o),拉入h文件的#include
只是将h文件注入编译流。这方面的头文件是组织实体
你可以把intfoo一个cpp文件中的代码>和extern int foo在另一个例子中,将每个编译成一个对象文件并将它们链接在一起。然后,第二个文件可以访问第一个文件中的同一个对象(事实上,extern int foo;
被推入cpp文件并不相关)。出于同样的原因,intfoo代码>放置在两个不同的cpp文件中会在将它们链接在一起时产生歧义
要确保一个翻译单元(编译的.o/.obj文件,如果您愿意)中的int-foo实际上仅由该单元使用,您可以执行以下两项操作之一:
将foo对象声明为静态,如下所示:static intfoo代码>此变量不受外部链接的影响;这对一个翻译单位来说是真正的隐私
将int对象放在未命名的命名空间中,如下所示:
名称空间{
//Foo位于此对象文件的唯一命名空间中
int foo;
}
这个特殊的构造为每个翻译单元生成一个唯一的名称空间。这使得对象文件中的每个foo对象都是不同的。您能提供一个示例吗?谢谢!很好的解释。所以.h文件的目的是让编译器知道others.cpp中包含哪些方法/函数/其他内容,然后让您在任何.cpp中使用它们,对吗?不完全是这样。cpp中的代码和h中的代码看起来与编译器相同,并且处理方式相同。然而,h文件是放置公共实体的地方;在本例中,声明--externintfoo代码>。这样,任何想在cpp文件中使用int的人都可以包含h文件,这就注入了extern int foo代码>输入到他们的代码中。这是为了您的利益,而不是编译器的利益。