源文件之间共享全局变量的问题(我正在使用包含保护)

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可防止头文件在同一源文件中被多次包含.除非您从其他头文件间接包含头文件,否则通常不会发生这种情况.

  • @karlphillip:没有"C头文件"这样的东西 - 头文件是用编译器#includes来编译的.`.h`这个名字对于C++是完全可以接受的.有些人可能会使用`.hpp`或`.hxx`,但这只是风格而根本没有任何意义. (3认同)