为什么这个转换为结构指针而不是编译时常量?

时间:2016-08-04 09:35:02

标签: c

由于关于test_array大小不是编译时常量的错误,下面的C程序无法使用gcc进行编译。为什么呢?

struct HWND__ { int unused; }; 
typedef struct HWND__ *HWND;

void test()
{
   static int test_array[ (unsigned long long)((HWND)1) ];
}

产生的错误是:

test.c: In function ‘test’:
test.c:5:14: error: storage size of ‘test_array’ isn’t constant
   static int test_array[ (unsigned long long)((HWND)1)  ];
              ^

1 个答案:

答案 0 :(得分:3)

根据C11标准,第6.6节:

  

整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式{{1}表达式和浮动常量,它们是强制转换的直接操作数。整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为_Alignofsizeof运算符的操作数的一部分。

     

在许多上下文中都需要整型常量表达式,例如结构的位字段成员的大小,枚举常量的值以及非可变长度数组的大小。

我认为这就是您的代码无效的原因。

我建议向hsc2hs开发人员提交错误报告,并在此期间手动修复这些病例。