在C ++中使用Extern变量进行编译

时间:2018-10-15 11:58:51

标签: c++ visual-c++ extern

我有一个头文件:headerFiles.h,其中包含以下extern变量:

extern char *err_msg;
extern char recvbuf[DEFAULT_BUFLEN];
extern char sendbuf[DEFAULT_BUFLEN]; 

此头文件包含在:Helper.h中,而Helper.h也包含在Helper.cpp中,因此,

headerFiles.h ->包括在-> Helper.h ->包括在-> Helper.cpp < / p>

但是当我在Helper.cpp文件中引用extern变量时,编译器给出以下链接错误:

  

错误LNK2001无法解析的外部符号“ char * err_msg”   (?err_msg @@ 3PADA)

我认为可以通过命令行进行编译,但是我想知道如何使用Visual C ++进行编译。我有VC ++ 2017 Community Edition。 请帮忙。

1 个答案:

答案 0 :(得分:4)

来自here

  

仅在变量和函数的声明中允许使用extern说明符(类成员或函数参数除外)。它指定外部链接,并且从技术上讲不会影响存储持续时间,但是不能在自动存储持续时间对象的定义中使用它,因此所有外部对象都具有静态或线程持续时间。另外,使用extern并且没有初始化程序的变量声明也不是定义。

换句话说,您的代码仅声明某个位置定义了err_msg(及其他)变量(!),并依靠链接器知道它的位置。 这就是为什么当找不到所需名称时出现链接器错误的原因。

一种可能的解决方案是定义:

char *err_msg;
char recvbuf[DEFAULT_BUFLEN];
char sendbuf[DEFAULT_BUFLEN]; 

在项目中的一个* .cpp文件中(只有一个)。