1

第一个头文件

   //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() 是类函数的任何类。

4

2 回答 2

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 个值。

于 2012-11-12T22:12:22.413 回答
1

您的设置存在不止一个问题。

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

Secondly, if you need a truly global array, i.e. one array accessible to the entire program, you have to declare it with external linkage, not as static. static declaration will produce a myriad of completely independent arrays, one for each translation unit.

于 2012-11-12T22:41:23.820 回答