为什么将其转换为结构体指针不是编译时常量?

3
以下的C程序由于test_array的大小不是编译时常量而无法通过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
可能是重复问题:https://dev59.com/0HA75IYBdhLWcg3w790Y - Mio Bambino
3
дёәд»Җд№ҲдёҚз”Ёstatic int test_array[1]жҲ–иҖ…еҸӘз”Ёstatic int test_arrayпјҹж„ҹи§үеғҸжҳҜ XY й—®йўҳгҖӮдҪ жғіиҰҒе®һзҺ°д»Җд№Ҳзӣ®зҡ„пјҹ - LPs
1
在C语言中没有“强制转换为结构体”。 - M.M
4
@M.M 这是将类型转换为“指向结构体的指针”,这没问题(只是在这里不适用)。 - ams
1
Clang 3.8说“警告:变长数组折叠为常量数组作为扩展”,但只有在使用-pedantic时。 - ams
显示剩余4条评论
1个回答

3
从C11标准第6.6节可知:
整数常量表达式应该具有整数类型,且只能包含整数常量、枚举常量、字符常量、结果为整数常量的sizeof表达式、_Alignof表达式和作为强制转换立即操作数的浮点常量。在整数常量表达式中,强制转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分。
在许多情况下需要使用整数常量表达式,例如结构体位域成员的大小、枚举常量的值以及非变长数组的大小等。
我认为这就是您的代码无效的原因。
建议向hsc2hs开发人员提交错误报告,并在此期间手动修复这些情况。

所以,特别是我有一个指针类型的强制转换,因此违反了有关强制转换运算符的规则。 - Andrew Rice
是的,看起来就是这样。 - ams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接