为什么#include这个文件不止一次是链接器错误?

bob*_*obo 4 c++

这个问题并不是一个"如何解决"问题,而是一个关于为什么这不起作用的问题?

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

我可以这样做:

int superGlobal;
#include "filethatUsesSuperglobal1.h"

int main()
{
  // go.
}
Run Code Online (Sandbox Code Playgroud)

这种方式只有在"filethatUsesSuperglobal1.h"在标题中没有附加.cpp文件的整个实现时才有效.

另一种方式("更严格的纠正方式")是使用extern:

externvardef.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
Run Code Online (Sandbox Code Playgroud)

externvardef.cpp

#include "externvardef.h"
int superGlobal;
Run Code Online (Sandbox Code Playgroud)

filethatUsesSuperglobal1.h

#include "externvardef.h"
#include <stdio.h>
void go();
Run Code Online (Sandbox Code Playgroud)

filethatUsesSuperglobal1.cpp

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

main.cpp中

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

#include "filethatUsesSuperglobal1.h"

int main()
{
  printf( "%d\n", superGlobal ) ;
  go() ;
}
Run Code Online (Sandbox Code Playgroud)

这是一个小问题和一个有点挑剔的问题,但为什么我需要声明它是extern - 不应该在"externvardef.h"上的#include警卫避免重新定义?

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

Dou*_*der 16

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

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

extern声明说:另一个编译单元(.o文件)的是要申报这个符号,这样我就可以使用它.因此,只有一个副本,因此链接器知道该怎么做.


Kei*_*all 5

#ifndef防护仅适用于每个文件.因此,如果你关闭extern,那么你可以在编译每个文件main.cpp,filethatUsesSuperglobal1.cpp和externvardef.cpp时定义3次superGlobal.

  • 好吧,不.#ifndef保护会阻止其中的所有内容在编译单元中遇到第二次及以后的时间进行评估.处理的每个.cpp都会重置所有#defines. (2认同)