因为您正在LCD上显示,我假设这是一个嵌入式系统。
不要将数据放入头文件中。
将数据放入普通的C或C++文件中。编译这个文件。它可能只包含数据,这没问题,也很容易更新。
然后使用头文件来访问数据。
例如,在一个images.c文件中:
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)
#define MAX_NUMBERS2 (450)
extern const byte numbers1[MAX_NUMBERS1] = { ... };
extern byte numbers2[MAX_NUMBERS2];
#endif
然后程序中的所有其他.c文件都可以访问它们。
将一个变量的定义放在头文件中(几乎)总是一个坏主意。
变量的声明,例如
extern byte numbers2 [MAX_NUMBERS2];
告诉C编译器在最终链接的程序中的某个地方有一个名为numbers2的数组变量。如果链接器没有从其他地方得到该定义,则会引发错误,因为未分配变量的空间。
变量的定义(注意没有外部),例如
byte numbers2 [MAX_NUMBERS2];
有效地告诉C编译器有一个名为numbers2的数组变量,并且应该在此处分配空间,在此源文件生成的目标代码中使用它来保存变量的值,最终链接的程序中。
当看到一个声明(由extern前缀符号)时,C编译器不会为numbers2分配空间,而是在看到实际的定义(没有extern)时分配空间。
因此,如果将任何变量的实际定义放在头文件中,并将其包含到多个源代码文件(.c)中,则C编译器将为该变量分配多次空间。然后,链接器将给出错误(通常是相同名称的多个定义)。
还有一个更微妙的问题。如果在首次开发程序时,头文件仅包含在一个源文件中,则程序将正确编译和链接。然后,在稍后的日期,如果第二个源文件包含头文件(可能有人将原始源代码文件拆分为两个文件),链接器将引发“多重定义”错误。这可能非常令人困惑,因为程序以前可以编译和链接,并且似乎没有任何变化。
总之,永远不要通过在头文件中放置定义来为变量分配空间。只需在头文件中放置变量的声明即可。
#define
。想一想,每次使用它时,你都会声明一个新的数组。当然,这将导致多个重新定义。宏只是文本替换。自己替换文本,看看是否有意义。 - Ed S.