这个问题并不是一个"如何解决"问题,而是一个关于为什么这不起作用的问题?
在C++中,我可以通过几种方式定义一组我想在多个文件中使用的变量.
我可以这样做:
int superGlobal;
#include "filethatUsesSuperglobal1.h"
int main()
{
// go.
}
Run Code Online (Sandbox Code Playgroud)
这种方式只有在"filethatUsesSuperglobal1.h"在标题中没有附加.cpp文件的整个实现时才有效.
另一种方式("更严格的纠正方式")是使用extern:
#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)
#include "externvardef.h"
int superGlobal;
Run Code Online (Sandbox Code Playgroud)
#include "externvardef.h"
#include <stdio.h>
void go();
Run Code Online (Sandbox Code Playgroud)
#include "filethatUsesSuperglobal1.h"
void go()
{
printf("%d\n", superGlobal );
}
Run Code Online (Sandbox Code Playgroud)
#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文件)的是要申报这个符号,这样我就可以使用它.因此,只有一个副本,因此链接器知道该怎么做.
#ifndef防护仅适用于每个文件.因此,如果你关闭extern,那么你可以在编译每个文件main.cpp,filethatUsesSuperglobal1.cpp和externvardef.cpp时定义3次superGlobal.