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

How to correctly write declarations of extern arrays in C's header files?

本文关键字:extern 数组 声明 文件      更新时间:2023-10-16

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

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

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]; 

我假设您希望数组"完全"是常量,因为许多人不知道指针上的两个const。这意味着不仅数组所指向的文本不能改变,数组中的指针也不能被改变为指向新的文本。

你应该确保数组中的数据是在源文件中定义的,否则你就有可能在内存中为每个包含头文件的源文件复制数据。

头文件

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"; };

externstatic是互斥的存储类

不要同时指定它们。你想要的:

extern const char * EnumStrings_WIP_Selection_Box[];

staticextern冲突

试试这个:

. 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),而不是暴露数组)。