3.4.1. 常数表达式

初始值设定项中支持扩展的常数表达式。 以下示例说明了缺省、--strict_warnings--strict 编译器模式下的编译器行为。

示例 1,分配变量地址

代码可能包含在文件范围内分配变量地址的常数表达式,例如:


int i;

int j = (int)&i; /* but not allowed by ISO */

为 C 语言进行编译时,这会出现以下行为:

  • 在缺省模式下,生成警告。

  • --strict_warnings 模式下,生成警告。

  • --strict 模式下,生成错误。

示例 2,常数初始值设定项

以下示例简要说明了 C 代码中具有包含常数值的表达式时的编译器行为:


                                      /*  Std    RVCT v3.1  */

extern int  const c = 10;             /*  ok        ok      */

extern int  const x = c + 10;         /* error      ext     */

static int        y = c + 10;         /* error      ext     */

static int  const z = c + 10;         /* error      ext     */

extern int *const cp = (int*)0x100;   /*  ok        ok      */

extern int *const xp = cp + 0x100;    /* error      ext     */

static int *      yp = cp + 0x100;    /* error      ext     */

static int *const zp = cp + 0x100;    /* error      ext     */

这指示由 ISO C 标准 Std 定义的行为以及 RVCT 中的行为:

  • ok 表明在所有 C 模式下均接受该语句。

  • ext 是 ISO C 标准的扩展。 此行为取决于编译 C 时使用的 strict 模式:

    非严格

    接受,不会发出警告。

    --strict_warnings

    接受,但会发出警告。

    --strict

    符合 ISO C 标准,并会生成错误。

另请参阅

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential