typedef 可变长度数组需要评估大小表达式吗?
int f(void);
int main(void)
{
typedef int (T) [ f() ]; // is f required to be evaluated ?
T x;
return sizeof x;
}
typedef指向VLA的指针是否需要评估大小表达式?
int f(void);
int main(void)
{
typedef int (*T) [ f() ]; // is f is required to be evaluated ?
T x;
return sizeof x;
}
更新. 在f
的定义中可见,那么对它的调用可以被优化掉:
int f(void)
{
return 4;
}
int main(void)
{
typedef int (*T) [ f() ];
return sizeof(T);
}
生成的代码(包括GCC和LLVM):
main:
mov eax, 8
ret
这是可以预期的,因为没有真正需要调用f
来确定指针的大小。
sizeof x
表达式是未定义行为。 - Adrian Molef()
的定义在一个单独的TU中,则无法在编译时评估其sizeof
。 - Adrian Molesizeof x
(但适用于sizeof *p
)。 - Chris Doddsizeof
运算符的工作原理。我一直认为VLA是“不完整类型”,但事实并非如此。 C11明确指出,VLA是一个完整的类型。 - Adrian Mole