Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 源文件之间共享的全局变量存在问题(I';m使用include-guard)_C++_Linker_Global Variables - Fatal编程技术网

C++ 源文件之间共享的全局变量存在问题(I';m使用include-guard)

C++ 源文件之间共享的全局变量存在问题(I';m使用include-guard),c++,linker,global-variables,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

我试图在两个.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;
}
谢谢

更新: “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;
}

头文件中的声明需要一个
extern

extern int shared_int;

那么,您将需要一个C++文件中的定义的实际实例(例如在<代码>共享.CPP < /COD>)中:


您在这里使用的include-guard是一种很好的做法,但在这种情况下不会有任何效果。include guard可防止头文件在同一源文件中被多次包含。这种情况通常不会发生,除非您从其他头文件中间接包含头文件。

首先,全局文件根本不是一个好主意,必须尽可能避免。假设在您的特定情况下,无论出于何种原因,从纯面向对象的角度来看,它都是强制要求的,我将采用以下方法:

a) 在一个文件中定义全局变量,例如a.cpp(如果该变量可以嵌入到命名空间中也可以)

b) 在a.cpp中写入get/set函数

c) 使用get/set函数访问a.cpp中的全局变量

这样,您将拥有一个非常模块化的设计和定义良好的界面。

您很快就会:

//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 shared_int = 0; // definition (extern ... is declaration)
                    // initialize force definition

int main(){
  shared_int = 5;
  printVal();
  return 0;
//shared.h
#ifndef包括防护罩
#定义INCLUDE_GUARD_H
#包括
#包括
//外部“C”int共享_int//我两个都试过了
外部信息共享信息;
int printVal();
#恩迪夫
//shared.cpp
#包括
#包括“shared.h”
int printVal(){
fprintf(标准,“a:%d\n”,共享\u int);
返回0;
}
//main.cpp
#包括
#包括“shared.h”
int共享_int=0;//定义(外部…是声明)
//初始化力定义
int main(){
共享_int=5;
printVal();
返回0;

}

答案已经由Greg给出,但一定要理解声明和定义之间的区别。这是一个重要的区别,它将帮助您更好地理解编译器的消息以及代码的整体语义。您更新的代码添加了
extern“C”
(这与我在回答中建议的有很大不同),并且根本不引入定义。试试我在回答中的建议。@greg Hewgill。我也试过了,同样的链接错误。谢谢,我注意到您在
main()
中使用了一个名为
shared\u int
的局部变量。该变量是局部变量,因此与全局定义无关。出现错误的原因是
print\u val()
不知道在哪里可以找到全局
shared\u int
。此时,您希望删除
main()
shared\u int
之前的
int
。然后,添加一个定义
int shared\u int在全局范围内
共享.cpp
@greg Hewgill。知道了。谢谢你,格雷格。我还注意到@ MunKeKin将C标题文件与C++编译器混合。这不是一个很好的实践,所以我只想指出,如果强制将符号导出为C符号,以避免名称损坏问题,可能会更好。只需将shared.h上的变量定义为:extern“C”int shared\u int@卡尔菲利普:没有所谓的“C头文件”——头文件是用任何包含它们的编译器编译的。对于C++,<>代码> h >名称是完全可以接受的。有些人可能会使用
.hpp
.hxx
,但这只是一种风格,毫无意义。
extern int shared_int;
int shared_int;
//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 shared_int = 0; // definition (extern ... is declaration)
                    // initialize force definition

int main(){
  shared_int = 5;
  printVal();
  return 0;