用C语言定义全局数组

时间:2014-12-17 13:07:29

标签: c arrays global

我想定义一个大小为 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:为什么第二种方式有效但第一种方式没有?

非常感谢任何帮助!提前谢谢!

3 个答案:

答案 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;

编译器认为你要:

  • 定义新数组(ok)
  • 名称:GlobalAr(ok)
  • 包含byte(ok)
  • 类型的元素
  • 内部零元素(嗯,不太好,应该是10)
  • 并最终失败因为你想将整个数组初始化为整数值(0b00001111)

如果你想定义数组并初始化它的元素,你必须将它们包含在{}

byte GlobalAr[10] = {0b00001111, 0b11110000};

无法更改文件范围内的数组元素。您需要将此类代码放在函数中。

答案 2 :(得分:0)

在.h文件中声明数组:

extern uint8_t GlobalVar[1];

在一个.c文件中(应该包含.h文件,如果您有不匹配的话,为了生成编译错误)必须有以下定义:

uint8_t GlobalVar[1] = { 0x0F };

0b00001111在C中无效,我认为这应该是0x0F


与“函数中的代码”示例的不同之处在于函数可能包含声明和语句。在该函数中,您声明一个没有初始化器的数组,然后使用赋值语句为其赋值。

在功能之外,这是不可能的;您只能提供初始值设定项作为定义的一部分,对于数组,它们采用=的形式,后跟括号括起的列表,该列表在;之前插入在定义的最后。