如何在C&#39的头文件中正确编写extern数组的声明?

时间:2014-08-13 14:16:36

标签: c++ arrays extern

首先,让我承认,指向数组的指针总是让我感到困惑。因此,我在问这个问题。

假设我想在我的程序中共享全局数据数组,例如:

static const char * EnumStrings_WIP_Selection_Box[] = { "Rectangular", "Siemens Gauss", "My_Gauss", "Planck-Taper", "Invalid"};

当我尝试声明相应的“extern”命令时

extern static const char * EnumStrings_WIP_Selection_Box[];

extern static const char * EnumStrings_WIP_Selection_Box[5];

我收到以下错误

error C2159: more than one storage class specified

另外,有人也可以告诉我这些之间的不同吗?

Foo *array[10];
Foo (*array1)[10]; 

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

我认为你希望你的数组完全是"完全"不变的,因为许多人都不知道指针上的两个锥体。这意味着不仅数组指向的文本不会改变,数组中的指针也不能改为指向新文本。

您应该确保数组中的数据是在源文件中定义的,否则您可能会冒内存中包含标题的每个源文件的数据副本。

标头文件

extern const char *const MyText[];

源文件

extern const char *const MyText[] = { "Hello", "There"; };

或者,C ++方法

标头文件

extern const std::vector<std::string> MyText;

源文件

extern const std::vector<std::string> MyText = { "Hello", "There"; };

在一个文件中强制它(不推荐在头文件中)

const char *const MyText[] = { "Hello", "There"; };

答案 1 :(得分:1)

externstatic都是存储类,并且是互斥的。

不要一起指定它们。你想要:

extern const char * EnumStrings_WIP_Selection_Box[];

staticextern冲突。

答案 2 :(得分:1)

试试这个:

.cpp文件:

/* not static */
const char * EnumStrings_WIP_Selection_Box[] = { "Rectangular",
    "Siemens Gauss", "My_Gauss", "Planck-Taper", "Invalid"};

.h [pp]档案:

extern const char * EnumStrings_WIP_Selection_Box[];

也就是说,为了未来的维护者,请考虑根据方法定义访问权限,而不是公开指针(即考虑在公共API中添加char const * const GetWipSelectionByIndex(const std::size_t index),而不是公开数组)。