“static / extern uint8_t array [2] = {0};”符合ANSI C规范?

时间:2011-11-15 15:16:33

标签: c embedded msp430

我对以下代码有疑问:

#include "all_needed.h"

static uint8_t array[2] = {0};

void main(void)
{
  ...
}

是否允许(模块)全局数组如上所述进行初始化,以使每个成员在符合ANSI C时设置为零?

我在Code Composer 5(MSP430项目)中遇到问题,我不得不将其更改为

static uint8_t array[2] = {0, 0};

正确初始化数组的第二个成员。

5 个答案:

答案 0 :(得分:11)

是的,这是允许的,并且应该将数组初始化为零。 C99,§6.7.8p10:

  

如果未初始化具有静态存储持续时间的对象   明确地说:

     

- 如果它有指针类型,则将其初始化为空指针;

     

- 如果它有算术类型,则初始化为(正或无符号)零;

     

- 如果是聚合,则根据这些规则初始化(递归)每个成员;

     

- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。

和p21:

  

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则剩余的聚合应隐式初始化,与具有静态存储持续时间的对象相同。

将错误报告给编译器供应商。

答案 1 :(得分:6)

感谢您的所有答案! 我进一步调查并发现编译器是不符合的,如中所述 第B.5.1节“初始化静态和全局变量”中的http://www.ti.com/lit/pdf/SLAU157

附录B:IAR 2.x / 3.x / 4.x到CCS C迁移

B.5其他差异

B.5.1初始化静态和全局变量

ANSI / ISO C标准规定,没有显式初始化的静态和全局(外部)变量必须预先初始化为0(在程序开始运行之前)。此任务通常在加载程序时执行,并在IAR编译器中实现:

/* IAR, global variable, initialized to 0 upon program start */
int Counter;

但是,TI CCS编译器不预先初始化这些变量;因此,应用程序可以满足此要求:

/* CCS, global variable, manually zero-initialized */
int Counter = 0;

答案 2 :(得分:5)

C标准说(6.7.8.21):

  

如果括号括起的列表中的初始值设定项少于聚合[...]成员的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化。

在6.2.5.21中:

  

数组和结构类型统称为聚合类型。

换句话说,您的代码没问题。

答案 3 :(得分:4)

static uint8_t array[2] = {0};

根据C标准,这会将array的两个成员初始化为0.如果您的编译器没有将它们归零,那么它就是违规的。

答案 4 :(得分:0)

我使用PIC micros,所以你的里程可能会有所不同......

我可以链接不同的启动库。一个不会初始化任何RAM。将所有RAM清除为0.另一个通常初始化变量。

查看链接器文件,看看它在做什么。