9

我对以下代码有疑问:

#include "all_needed.h"

static uint8_t array[2] = {0};

void main(void)
{
  ...
}

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

我在 Code Composer 5 (MSP430 Project) 中遇到问题,我必须将其更改为

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

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

4

5 回答 5

11

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

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

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

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

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

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

和 p21:

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

向您的编译器供应商报告错误。

于 2011-11-15T15:23:46.893 回答
6

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

附录 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;
于 2011-11-16T12:12:09.810 回答
5

C标准说(6.7.8.21):

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

在 6.2.5.21 中:

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

换句话说,您的代码是可以的。

于 2011-11-15T15:25:13.130 回答
4
static uint8_t array[2] = {0};

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

于 2011-11-15T15:19:25.863 回答
0

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

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

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

于 2011-11-18T19:55:27.660 回答