我想定义一个大小为 1字节的数组,可用于几个.c文件,因此我需要一个全局数组。我知道全局变量的方式:
//"globals.h"
extern uint8_t GlobalVar; //Declaration
//"globals.c"
uint8_t GlobalVar = 0; //Definition
因此,对于我的数组,我首先使用typedef来定义一个字节:
typedef uint8_t byte; //in "globals.h" right at the beginning
然后我继续声明和定义我的数组:
//"globals.h"
extern byte GlobalAr[10];
//"globals.c"
byte GlobalAr[0] = 0b00001111;
但后来我得到了这些错误:
错误1' GlobalAr'
的冲突类型消息2之前宣布的' GlobalAr'在这里
错误3初始化程序无效
如果我在一个函数中尝试相同的东西它完全正常,即:
typedef uint8_t byte;
void function()
{
byte GlobalAr[10];
GlobalAr[0] = 0b00001111;
GlobalAr[1] = 0b11110000;
}
Q1:你们能帮助我找出如何定义全局数组并正确初始化它吗?
Q2:为什么第二种方式有效但第一种方式没有?
非常感谢任何帮助!提前谢谢!
答案 0 :(得分:1)
我想,你错过了定义数组。
IMO,你想要的是
byte GlobalAr[10] = {0};
GlobalAr[0] = 0b00001111;
GlobalAr[1] = 0b00001010;
等等。
否则,根据您的代码
extern byte GlobalAr[10];
和
byte GlobalAr[0] = 0b00001111;
您尝试重新定义 GlobalAr
数组,其大小不同[10
vs 0
],这是错误的。
另外,如果确实只想要数组一个元素 ,则必须将声明和定义更改为
byte GlobalAr[1] = {0b00001111};
在访问时,您可以使用GlobalAr[0]
。
答案 1 :(得分:1)
这一行是完全错误的:
byte GlobalAr[0] = 0b00001111;
编译器认为你要:
如果你想定义数组并初始化它的元素,你必须将它们包含在{}
byte GlobalAr[10] = {0b00001111, 0b11110000};
无法更改文件范围内的数组元素。您需要将此类代码放在函数中。
答案 2 :(得分:0)
在.h文件中声明数组:
extern uint8_t GlobalVar[1];
在一个.c
文件中(应该包含.h
文件,如果您有不匹配的话,为了生成编译错误)必须有以下定义:
uint8_t GlobalVar[1] = { 0x0F };
0b00001111
在C中无效,我认为这应该是0x0F
。
与“函数中的代码”示例的不同之处在于函数可能包含声明和语句。在该函数中,您声明一个没有初始化器的数组,然后使用赋值语句为其赋值。
在功能之外,这是不可能的;您只能提供初始值设定项作为定义的一部分,对于数组,它们采用=
的形式,后跟括号括起的列表,该列表在;
之前插入在定义的最后。