gpt4 book ai didi

c++ - 为什么#include 这个文件不止一次出现链接器错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:26 25 4
gpt4 key购买 nike

这个问题与其说是一个“如何解决”的问题,不如说是一个关于为什么行不通的问题?

在 C++ 中,我可以通过几种方式定义我想在多个文件中使用的一堆变量。

我可以这样做:

int superGlobal;
#include "filethatUsesSuperglobal1.h"

int main()
{
// go.
}

只有当“filethatUsesSuperglobal1.h”在 header 中有完整的实现并且没有附加的 .cpp 文件时,这种方式才有效。

另一种方式(“更正确的更正”方式)是使用 extern:

外部变量.h

#ifndef externvardef_h
#define externvardef_h
// Defines globals used across multiple files.
// The only way this works is if these are declared
// as "extern" variables
extern int superGlobal;

#endif

外部变量.cpp

#include "externvardef.h"
int superGlobal;

filethatUsesSuperglobal1.h

#include "externvardef.h"
#include <stdio.h>
void go();

filethatUsesSuperglobal1.cpp

#include "filethatUsesSuperglobal1.h"
void go()
{
printf("%d\n", superGlobal );
}

main.cpp

#include <stdio.h>
#include "externvardef.h"

#include "filethatUsesSuperglobal1.h"

int main()
{
printf( "%d\n", superGlobal ) ;
go() ;
}

这是一个小问题,也是一个有点挑剔的问题,但是为什么我需要将其声明为外部 - “externvardef.h”上的#include 守卫不应该避免重新定义吗?

这是一个链接器错误,即使该头文件周围有#include 保护。所以这不是编译器错误,而是链接器错误,但这是为什么。

最佳答案

从代码的角度考虑是否有这个符号 superGlobal 指向一个整数。

你有一堆 .o 文件链接在一起成为一个可执行文件。每个 .o 文件都有自己的 superGlobal 符号。链接器应该使用哪个?

extern 声明说:另一个编译单元(.o 文件)将声明这个符号,所以我可以使用它。因此只有一个拷贝,因此链接器知道该做什么。

关于c++ - 为什么#include 这个文件不止一次出现链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1539003/

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