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
extern int fooextern 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输入到他们的代码中。这是为了您的利益,而不是编译器的利益。