Rei*_*eid 9 c arrays header-files c-preprocessor
我有几个450元素字符数组(存储位图数据显示在lcd屏幕上.)我想把它们放在头文件和#define它们下面,但我不断收到编译错误.我怎么用C做这个?
#define numbers[450] {0, 1,etc...}
#define numbers {0, 1, etc...}
#define numbers[450] 然后设置数字
还有很多...
Ed *_* S. 10
嗯......你当然不需要使用定义.只需将它们作为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
Run Code Online (Sandbox Code Playgroud)
此外,如果您需要有关编译错误的帮助,那么您应该发布您的代码.
因为你正在液晶显示器上显示,我假设这是一个嵌入式系统.
不要将数据放入标题中.
将数据放入普通的C或C++文件中.编译这个.它可能只包含数据,这是可以的,并且可以轻松更新.
然后使用头文件来访问数据.
例如,在images.c文件中:
#include "images.h"
const byte numbers1[MAX_NUMBERS1] = { ... };
byte numbers2[MAX_NUMBERS2]; // will be initialsied to 0
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然后程序中的所有其他.c文件都可以访问它们.
这是(几乎)总是一个坏主意,把一个定义一个的可变进的头文件.
变量的声明,例如.
extern byte numbers2[MAX_NUMBERS2];
告诉C编译器在最终的链接程序中有一个名为numbers2 其他地方的数组变量.如果链接器没有得到该定义(来自其他地方),那么它将引发错误,因为分配的变量没有空间.
变量的定义(注意没有外部),例如.
byte numbers2[MAX_NUMBERS2];
有效地告诉C编译器有一个被调用的数组变量numbers2,它应该在这个源文件的结果对象代码中分配空间,这将用于在最终的链接程序中保存变量的值.
对于空间numbers2是不通过时,看到一个声明(由之前的C编译器分配的extern),当它看到实际的定义(没有被分配extern).
因此,如果将任何变量的实际定义放在头文件中,并将其包含在多个源代码文件(.c)中,则C编译器将多次为该变量分配空间.然后链接器将给出错误(通常是同名的多个定义).
还有一个更微妙的问题.如果,在第一次开发程序时,头文件只包含一个源文件,那么程序将正确编译和链接.然后,在以后的日期,如果第二个源文件包含标题(可能有人刚刚将原始源代码文件拆分为两个文件),链接器将引发"多个定义"错误.这可能非常令人困惑,因为用于编译和链接的程序,显然没有任何改变.
摘要
永远不要通过在头文件中放置定义来为变量分配空间.只在头文件中放置变量声明.