C++ 为什么;int i";有多个定义?

C++ 为什么;int i";有多个定义?,c++,linker-errors,header-files,C++,Linker Errors,Header Files,我有两个文件,如下所示: Test1.h Test2.cpp 在包含所有内容之后,头文件此时应该变得无关紧要 我的另一个问题是,如果我在头文件中用extern声明inti,并将其包含在.cpp中,那么它会是外部链接的一个示例吗?因为我通常看到两个.c或.cpp之间的外部链接,如中所示,但如果您明确包含该文件,它是否仍被视为具有外部链接?可能您正试图从两个翻译单元创建可执行文件 您的错误显示对象已在Test1.obj中定义。您的程序可能是Test1.obj+Test2.obj,并且两个文件都包含相

我有两个文件,如下所示:

Test1.h

Test2.cpp

在包含所有内容之后,头文件此时应该变得无关紧要


我的另一个问题是,如果我在头文件中用
extern
声明
inti
,并将其包含在.cpp中,那么它会是外部链接的一个示例吗?因为我通常看到两个
.c
.cpp
之间的外部链接,如中所示,但如果您明确包含该文件,它是否仍被视为具有外部链接?

可能您正试图从两个翻译单元创建可执行文件


您的错误显示对象已在Test1.obj中定义。您的程序可能是Test1.obj+Test2.obj,并且两个文件都包含相同的定义,具有外部链接。

您可能正在尝试从两个翻译单元创建可执行文件

您的错误显示对象已在Test1.obj中定义。您的程序可能是Test1.obj+Test2.obj,两个文件都包含相同的定义,具有外部链接。

每个编译单元(一个.cpp文件)分别生成自己的一组符号,然后由链接器链接在一起

头文件“成为”它所包含的编译单元的一部分,编译成目标文件(.obj在Windows中,.o在Unix系统中)

因此,就像您在每个编译单元中定义了一个全局“i”。 正确的解决方案(如你所知,如果你必须有一个全局)是在头中声明它为“extern”,然后让一个编译单元实际定义它

Include-guard仅防止同一编译单元中包含两次相同的头,如果我包含and并且其中一个包含另一个,则可能发生这种情况。

每个编译单元(一个.cpp文件)分别生成自己的一组符号,然后由链接器链接在一起

头文件“成为”它所包含的编译单元的一部分,编译成目标文件(.obj在Windows中,.o在Unix系统中)

因此,就像您在每个编译单元中定义了一个全局“i”。 正确的解决方案(如你所知,如果你必须有一个全局)是在头中声明它为“extern”,然后让一个编译单元实际定义它

Include-guard只会防止同一个头在同一个编译单元中包含两次,如果我包含and,而其中一个包含另一个,就会发生这种情况

当我包含头文件时,它应该意味着所有内容都被复制到Test2.cpp中,并且应该变成:

是的,然后在Test1.cpp中执行完全相同的操作(您没有向我们展示)

因此,有多种定义

当我包含头文件时,它应该意味着所有内容都被复制到Test2.cpp中,并且应该变成:

是的,然后在Test1.cpp中执行完全相同的操作(您没有向我们展示)

因此,有多种定义

我怎么能有多个定义

具有该定义的文件包含在多个翻译单元(cpp文件)中。一个单元被编译到目标文件
Test1.obj
。另一个单位的来源显示在您的答案中(
Test2.cpp
)。尝试将对象文件链接在一起时会显示错误

  • 头文件具有include-guard
  • 防止文件内容在单个翻译单元内重复。分开单位没什么区别

    我的另一个问题是,如果我在头文件中声明int I和extern,并将其包含在.cpp中,那么它会是一个外部链接的示例吗

    extern
    使链接显式外部化。但是,即使没有
    extern
    ,名称空间范围中声明的变量在默认情况下也具有隐式外部链接(也有例外)。这种情况下的区别在于
    extern
    变量声明不是定义,除非有初始值设定项

    通过在一个.cpp中创建一个变量extern并在另一个中定义它,链接器可以找到它的定义,我可以实现外部链接,而不包括头文件,即两个.cpp文件。但如果我有一个带有extern变量的头文件,并将其包含在另一个.cpp中,这算是外部链接吗

    extern声明如何在cpp文件中结束并不重要。无论它是否包含在标题中,它都声明了一个带有外部链接的变量

    我怎么能有多个定义

    具有该定义的文件包含在多个翻译单元(cpp文件)中。一个单元被编译到目标文件
    Test1.obj
    。另一个单位的来源显示在您的答案中(
    Test2.cpp
    )。尝试将对象文件链接在一起时会显示错误

  • 头文件具有include-guard
  • 防止文件内容在单个翻译单元内重复。分开单位没什么区别

    我的另一个问题是,如果我在头文件中声明int I和extern,并将其包含在.cpp中,那么它会是一个外部链接的示例吗

    extern
    使链接显式外部化。但是,即使没有
    extern
    ,名称空间范围中声明的变量在默认情况下也具有隐式外部链接(也有例外)。这种情况下的区别在于
    extern
    变量声明不是定义,除非有初始值设定项

    通过在一个.cpp中创建一个变量extern并在另一个中定义它,链接器可以找到它的定义,我可以实现外部链接,而不包括头文件,即两个.cpp文件。但如果我有一个带有extern变量的头文件,并将其包含在另一个.cpp中,这算是外部链接吗

    extern声明如何在cpp文件中结束并不重要。Whe
    #ifndef TEST_H
    #define TEST_H
    
    int i = 10;
    
    #endif
    
    #include <iostream>
    
    #include "Test1.h"
    
    int main()
    {
        std::cout << i << std::endl;
    }
    
    #include <iostream>
    
    int i = 10
    
    int main()
    {
        std::cout << i << std::endl;
    }