gpt4 book ai didi

c++ - 为什么 "int i"有多个定义?

转载 作者:行者123 更新时间:2023-11-28 00:01:48 25 4
gpt4 key购买 nike

我有如下两个文件:

Test1.h

#ifndef TEST_H
#define TEST_H

int i = 10;

#endif

Test2.cpp

#include <iostream>

#include "Test1.h"

int main()
{
std::cout << i << std::endl;
}

我知道我可以通过在 Test1.h 中使用 externconst 来解决这个问题。

但我的问题是“我不明白这个错误”。

error LNK2005: "int i" (?i@@3HA) already defined in Test1.obj
error LNK1169: one or more multiply defined symbols found

int i 怎么能有多个定义呢?

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

Test2.cpp

#include <iostream>

int i = 10

int main()
{
std::cout << i << std::endl;
}

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

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

最佳答案

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

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

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

Include guards 仅防止同一 header 在同一编译单元中被包含两次,如果我包含并且其中一个包含另一个,则可能会发生这种情况。

关于c++ - 为什么 "int i"有多个定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com