mon*_*ing 5 c++ linker global-variables
我试图在两个.cpp文件之间共享相同的变量,它们包含相同的.h文件.
但我得到链接错误,告诉我有多个定义.我觉得很尴尬,因为我正在使用包括警卫
//main.cpp
#include <cstdio>
#include "shared.h"
int main(){
shared_int = 5;
printVal();
return 0;
}
//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
int shared_int;
int printVal();
#endif
//shared.cpp
#include <cstdio>
#include "shared.h"
int printVal(){
fprintf(stderr,"a: %d\n",shared_int);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很喜欢
g++ shared.cpp -c;g++ main.cpp shared.o
shared.o:(.bss+0x0): multiple definition of `shared_int'
/tmp/cci8w8Am.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:'extern'仍然不起作用,但现在我得到一个未定义的引用这些是更新的文件
//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
//extern "C" int shared_int;//i've tried both
extern int shared_int;
int printVal();
#endif
//shared.cpp
#include <cstdio>
#include "shared.h"
int printVal(){
fprintf(stderr,"a: %d\n",shared_int);
return 0;
}
//main.cpp
#include <cstdio>
#include "shared.h"
int main(){
int shared_int = 5;
printVal();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我编译的方式
g++ main.cpp shared.o
shared.o: In function `printVal()':
shared.cpp:(.text+0x6): undefined reference to `shared_int'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
Gre*_*ill 15
头文件中的声明需要extern:
extern int shared_int;
Run Code Online (Sandbox Code Playgroud)
然后,您将需要一个 C++文件中的实际定义实例(例如in shared.cpp):
int shared_int;
Run Code Online (Sandbox Code Playgroud)
你在这里使用的包括守卫是很好的做法,但在这种情况下它们不会有任何影响.include guard可防止头文件在同一源文件中被多次包含.除非您从其他头文件间接包含头文件,否则通常不会发生这种情况.