在C中定义数组

lzfw57am  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(87)

我有几个450元素的字符数组(存储位图数据以显示在lcd屏幕上。)我想把它们放在一个头文件下,并#define它们,但我不断得到编译错误。我怎么会在**
#define numbers[450] {0, 1,etc...}
#define numbers {0, 1, etc...}
#define numbers[450],然后再设置数字
还有更多...

njthzxwz

njthzxwz1#

你当然不需要用定义。只需将它们作为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

字符串
另外,如果你想在编译错误上得到帮助,那么你应该发布你的代码。

8mmmxcuj

8mmmxcuj2#

因为您是在LCD上显示,所以我假设这是一个嵌入式系统。
不要将数据放入标头中。
将数据放入普通的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的数组变量 * 在其他地方 *。如果链接器没有得到该定义(从其他地方),那么它将引发一个错误,因为没有为变量分配的空间。
一个变量的定义(注意没有extern),例如。byte numbers2[MAX_NUMBERS2];有效地告诉C编译器,有一个名为numbers2的数组变量,它应该在这里分配空间,在这个源文件的结果目标代码中,这将用于保存最终链接程序中变量的值。
numbers2的空间 * 不是 * C编译器在看到声明(前面有extern)时分配的,而是在看到实际定义(没有extern)时分配的。
因此,如果你把任何变量的实际定义放在一个头文件中,并将其包含在多个源代码文件(.c)中,C编译器将为该变量分配多次空间。然后链接器将给予一个错误(通常是同一个名称的多个定义)。
还有一个更微妙的问题。如果在第一次开发程序时,头文件只包含一个源文件,那么程序将正确编译和链接。然后,在稍后的日期,如果第二个源文件包括头(也许有人刚刚将原始源代码文件分成两个文件),链接器将引发“多个定义”错误。这可能是非常混乱的,因为程序用于编译和链接,显然没有什么变化。

  • 总结 *

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

6ie5vjzr

6ie5vjzr3#

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

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

q9rjltbz

q9rjltbz4#

#define ARRAY_SIZE 5
#define ARRAY (int[ARRAY_SIZE]){1, 2, 3, 4, 5}

字符串
但似乎你需要有gcc v4.0或以上。

相关问题