/* 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
#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
4条答案
按热度按时间njthzxwz1#
你当然不需要用定义。只需将它们作为const,静态数组添加到头部。
字符串
另外,如果你想在编译错误上得到帮助,那么你应该发布你的代码。
8mmmxcuj2#
因为您是在LCD上显示,所以我假设这是一个嵌入式系统。
不要将数据放入标头中。
将数据放入普通的C或C++文件中。编译这个。它可能只包含数据,这是好的,并使其易于更新。
然后使用头文件给予访问数据。
例如,在images.c文件中:
字符串
然后images.h是:
型
然后程序中的所有其他.c文件都可以访问它们。
将变量的定义放入头文件中(几乎)总是一个坏主意。
变量的声明,例如。
extern byte numbers2[MAX_NUMBERS2];
告诉C编译器,在最终的链接程序中有一个名为numbers2
的数组变量 * 在其他地方 *。如果链接器没有得到该定义(从其他地方),那么它将引发一个错误,因为没有为变量分配的空间。一个变量的定义(注意没有extern),例如。
byte numbers2[MAX_NUMBERS2];
有效地告诉C编译器,有一个名为numbers2
的数组变量,它应该在这里分配空间,在这个源文件的结果目标代码中,这将用于保存最终链接程序中变量的值。numbers2
的空间 * 不是 * C编译器在看到声明(前面有extern
)时分配的,而是在看到实际定义(没有extern
)时分配的。因此,如果你把任何变量的实际定义放在一个头文件中,并将其包含在多个源代码文件(.c)中,C编译器将为该变量分配多次空间。然后链接器将给予一个错误(通常是同一个名称的多个定义)。
还有一个更微妙的问题。如果在第一次开发程序时,头文件只包含一个源文件,那么程序将正确编译和链接。然后,在稍后的日期,如果第二个源文件包括头(也许有人刚刚将原始源代码文件分成两个文件),链接器将引发“多个定义”错误。这可能是非常混乱的,因为程序用于编译和链接,显然没有什么变化。
千万不要通过在头文件中放置定义来为变量分配空间。只将变量声明放在头文件中。
6ie5vjzr3#
我也遇到过类似的问题。在我的例子中,我需要一个常量数组来作为其他静态数组的大小。当我试图使用
字符串
然后声明:
型
我从编译器得到一个错误:
型
所以,最后我做了以下事情(也许有更优雅的方法可以做到这一点):
型
q9rjltbz4#
字符串
但似乎你需要有gcc v4.0或以上。