错误C2065:在另一个头文件中使用变量时未声明的标识

时间:2012-11-12 22:04:12

标签: c++

第一个头文件

   //status.h file
    static int A[2] = {1,2};

另一个头文件

//anotherfile.h file
#include "status.h"

int GETID()
{
  return A[1];
}

当我编译说A是未声明的标识符时,我一直收到错误。我试图将A定义为extern const int,但它仍然没有帮助。在我的IDE(VS2010)中,当我将鼠标悬停在GETID()下的A值时,我实际上可以看到A的内容。

我想使用A作为全局数组,因为在我的真实程序中,A是一个包含250个元素的数组,我不想在程序中声明它多于一个位置。在这种情况下,我可以做什么来在另一个头文件中使用数组A?

编辑:A不属于GETID()是类函数的任何类。

2 个答案:

答案 0 :(得分:3)

命名空间作用域static不是全局的 - 它是具有内部链接的变量 - 将为包含标题的每个翻译单元创建一个副本。您必须将其声明为extern并在标题中使用包含警戒:

//status.h file
#ifndef STATUS_H
#define STATUS_H
extern int A[2];
#endif

//status.cpp
#include "status.h"
int A[2] = {1,2}

您想使用A的任何地方,现在只需#include "status.h"

请注意,int A[2] = {1,2,3};是非法的,因为您说A只有2个值,但是您给它3个。

答案 1 :(得分:1)

您的设置存在多个问题。

首先,如果事情真的像你说的那样,你就不会从你的代码中得到这个错误。您的代码,您发布它的方式,是完全可编译的,那里没有“未声明的标识符”问题。您实际收到此错误的原因是您的头文件的循环包含。直接或间接地,您设法将status.h加入anotherfile.h,同时anotherfile.h加入status.h。圆形标题包含永远不会有效即使你用全局数组解决了你的主要问题,你仍然必须摆脱循环标题包含,因为它将在以后以其他方式重新抬头。

其次,如果您需要一个真正的全局数组,即整个程序可以访问的一个数组,则必须使用外部链接声明它,而不是staticstatic声明将产生无数完全独立的数组,每个数组用于一个翻译单元。