因为您在 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 somewhere 的数组变量。如果链接器没有(从其他地方)获得该定义,那么它将引发错误,因为分配的变量没有空间。
变量的定义(注意没有extern),例如。
byte numbers2[MAX_NUMBERS2];
有效地告诉 C 编译器有一个名为 numbers2 的数组变量,它应该在此源文件的结果目标代码中分配空间,这将用于保存最终变量的值,链接程序。
numbers2 的空间不是由 C 编译器在看到声明时分配的(前面是 extern),它是在看到实际定义时分配的(没有 extern )。
因此,如果您将任何变量的实际定义放在头文件中,并将其包含在多个源代码文件(.c)中,C 编译器将多次为该变量分配空间。那么链接器就会报错(通常是同名的多个定义)。
还有一个更微妙的问题。如果在第一次开发程序时,头文件只包含一个源文件,那么程序将正确编译和链接。然后,在以后的日期,如果第二个源文件包含标头(可能有人刚刚将原始源代码文件拆分为两个文件),链接器将引发“多个定义”错误。这可能会非常令人困惑,因为用于编译和链接的程序显然没有任何改变。
总结
切勿通过将定义放在头文件中来为变量分配空间。仅将变量 declarations 放在头文件中。