“static / extern uint8_t array = {0};”是否符合ANSI C规范?
我对以下代码有疑问:
#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};
用于正确初始化arrays的第二个成员。
是的,这是允许的,并且应该将数组初始化为零。 C99,§6.7.8第10页:
如果未显式初始化具有静态存储持续时间的对象,则:
– 如果它有指针类型,则将其初始化为空指针;
– 如果它有算术类型,则初始化为(正或无符号)零;
– 如果是聚合,则根据这些规则初始化(递归)每个成员;
– 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员。
和p21:
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同。
将错误报告给编译器供应商。
谢谢你的所有答案! 我进一步调查并发现编译器不符合http://www.ti.com/lit/pdf/SLAU157中B.5.1节“初始化静态和全局变量”中所述:
附录B:IAR 2.x / 3.x / 4.x到CCS C-Migration
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;
C标准说(6.7.8.21):
如果括号括起的列表中的初始值设定项少于聚合[…]成员的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化。
在6.2.5.21中:
数组和结构类型统称为聚合类型。
换句话说,您的代码没问题。
static uint8_t array[2] = {0};
根据C标准,这将初始化array
两个成员为0.如果您的编译器没有将它们归零,那么它是违反的。
我使用PIC微处理器,所以你的里程可能会有所不同……
我可以链接不同的启动库。一个不会初始化任何RAM。 将所有RAM清除为0.另一个通常初始化变量。
查看链接器文件,看看它在做什么。