在C中定义数组

我有几个450元素字符数组(存储在lcd屏幕上显示的位图数据。)我想将它们放在头文件下并#define它们,但我不断收到编译错误。 我怎么用C做这个?

#define numbers[450] {0, 1,etc...}

#define numbers {0, 1, etc...}

#define numbers[450]然后设置数字

还有很多…

嗯……你当然不需要使用定义。 只需将它们作为const,静态数组添加到标头中。

 /* prevents multiple, redundant includes */ /* make sure to use a symbol that is fairly sure to be unique */ #ifndef TEST_H #define TEST_H /* your image data */ const char image[] = { 1, 2, 3, 4, ... }; #endif 

此外,如果您需要有关编译错误的帮助,那么您应该发布您的代码。

因为你正在液晶显示器上显示,我假设这是一个嵌入式系统。

不要将数据放入标题中。

将数据放入普通的C或C ++文件中。 编译这个。 它可能只包含数据,这是可以的,并且可以轻松更新。

然后使用头文件来访问数据。

例如,在images.c文件中:

 #include "images.h" const byte numbers1[MAX_NUMBERS1] = { ... }; byte numbers2[MAX_NUMBERS2]; // will be initialsied to 0 

images.h是:

 #ifndef _IMAGES_H_ #define _IMAGES_H_ typedef unsigned char byte; #define MAX_NUMBERS1 (450) // different constants in case you change something #define MAX_NUMBERS2 (450) // even better if you can do const static int MAX_NUMBERS1=450; // but depends on the compiler extern const byte numbers1[MAX_NUMBERS1] = { ... }; extern byte numbers2[MAX_NUMBERS2]; // will be initialised to 0 #endif 

然后程序中的所有其他.c文件都可以访问它们。

变量定义放入头文件中(几乎)总是一个坏主意。

变量的声明 ,例如。 extern byte numbers2[MAX_NUMBERS2]; 告诉C编译器在最终的链接程序中有一个名为numbers2的数组变量。 如果链接器没有得到该定义(来自其他地方),那么它将引发错误,因为分配的变量没有空间。

变量的定义(注意没有外部),例如。 byte numbers2[MAX_NUMBERS2]; 有效地告诉C编译器有一个名为numbers2的数组变量,它应该在这个源文件的结果对象代码中分配空间,这将用于在最终的链接程序中保存变量的值。

numbers2的空间在看到声明(以extern numbers2 )时不由 C编译器分配,它在看到实际定义(没有extern )时被分配。

因此,如果将任何变量的实际定义放在头文件中,并将其包含在多个源代码文件(.c)中,则C编译器将多次为该变量分配空间。 然后链接器将给出错误(通常是同名的多个定义)。

还有一个更微妙的问题。 如果,在第一次开发程序时,只包含头文件是一个源文件,那么程序将正确编译和链接。 然后,在以后的日期,如果第二个源文件包含标题(可能有人刚刚将原始源代码文件拆分为两个文件),链接器将引发“多个定义”错误。 这可能非常令人困惑,因为用于编译和链接的程序,显然没有任何改变。

摘要
永远不要通过在头文件中放置定义来为变量分配空间。 只将变量声明放在头文件中。

我遇到过类似的问题。 在我的例子中,我需要一个常量数组,以便用作其他静态数组的大小。 当我试图使用

 const int my_const_array[size] = {1, 2, 3, ... }; 

然后声明:

 int my_static_array[my_const_array[0]]; 

我的编译器收到错误:

 array bound is not an integer constant 

所以,最后我做了以下(也许还有更优雅的方法):

 #define element(n,d) ==(n) ? d : #define my_const_array(i) (i) element(0,1) (i) element(1,2) (i) element(2,5) 0