C++ 为什么;int i";有多个定义?
我有两个文件,如下所示: Test1.h Test2.cpp 在包含所有内容之后,头文件此时应该变得无关紧要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,并且两个文件都包含相
我的另一个问题是,如果我在头文件中用
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
)。尝试将对象文件链接在一起时会显示错误
extern
使链接显式外部化。但是,即使没有extern
,名称空间范围中声明的变量在默认情况下也具有隐式外部链接(也有例外)。这种情况下的区别在于extern
变量声明不是定义,除非有初始值设定项
通过在一个.cpp中创建一个变量extern并在另一个中定义它,链接器可以找到它的定义,我可以实现外部链接,而不包括头文件,即两个.cpp文件。但如果我有一个带有extern变量的头文件,并将其包含在另一个.cpp中,这算是外部链接吗
extern声明如何在cpp文件中结束并不重要。无论它是否包含在标题中,它都声明了一个带有外部链接的变量
我怎么能有多个定义
具有该定义的文件包含在多个翻译单元(cpp文件)中。一个单元被编译到目标文件Test1.obj
。另一个单位的来源显示在您的答案中(Test2.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;
}