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

Til*_*ild 9 c embedded msp430

我有一个关于以下代码的问题:

#include "all_needed.h"

static uint8_t array[2] = {0};

void main(void)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

static uint8_t array[2] = {0, 0};
Run Code Online (Sandbox Code Playgroud)

用于正确初始化阵列的第二个成员.

Ste*_*non 11

是的,这是允许的,并且应该将数组初始化为零.C99,§6.7.8第10页:

如果未显式初始化具有静态存储持续时间的对象,则:

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

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

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

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

和p21:

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

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

  • +1报告"报告错误",但我打赌他们会称之为"功能"...... (2认同)

Til*_*ild 6

谢谢你的所有答案!我进一步调查并发现编译器是不符合的,如 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;
Run Code Online (Sandbox Code Playgroud)

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

/* CCS, global variable, manually zero-initialized */
int Counter = 0;
Run Code Online (Sandbox Code Playgroud)


Lin*_*cer 5

C标准说(6.7.8.21):

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

在6.2.5.21中:

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

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