数组分为头文件和源文件

Arrays split into header and source files

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

由于一些奇怪的原因,我总是忘记数组的确切语法。我如何在头部创建一个数组,并在构造函数中初始化它?是否可以在头中初始化它以及定义它?

您可以使用extern关键字在头文件中声明变量,但是在头文件中定义可能会导致多个定义和链接器错误(除非您使用static关键字和头文件保护,在这种情况下,您将为每个翻译单元创建单独的数组实例)。

例如:

extern int array[ARRAY_SIZE];
static int stArray[ARRAY_SIZE] = {initialized static array};

X.CPP

#include the header
int array[ARRAY_SIZE] = {initialize here}
... some code
int i = array[index]; //access the array initialized in X.CPP
int j = stArray[index]; //access the array initialized in X.CPP
                      //when including the header

Y.CPP

#include the header
// don't initialize
...
in some code do:
int i = array[index]; // you'll access the array initialized in X.CPP.
int j = stArray[index]; //access the array initialized in Y.CPP when
                   // including the header, not the same as in X.CPP

编辑

Re类成员——它们通常在头文件中定义,但是在创建类实例(对象)时创建,并且应该在构造函数中初始化。除非您将它们标记为static,然后您必须在某处的CPP文件中定义它们(以与extern变量类似的方式)。

另外,在注释中提到:全局变量不应该在main被调用之前被访问(即:一个全局/静态变量不应该基于另一个全局/静态值的值被初始化)。这可能会导致静态初始化失败的问题。

好吧,你总是可以使用指针并动态地做…只需要记得用delete[]来清理。

在头文件中声明一个指针…

   int * x = 0;

在cpp中,调用new,做你需要做的事情。

   x = new int[15];
   //do stuff
   delete [] x;

我在这个问题上多读了一点,似乎是不可能的:这实际上击中了c++语言的一个缺点-在c++中没有办法初始化非静态数组成员。