【发布时间】:2015-03-18 09:54:07
【问题描述】:
作为对question 关于sizeof 及其在C99 VLA 方面的行为的回答的一部分,我写了以下内容:
故意创建一个案例,其中
count_of的语义对于 VLA 来说实际上会有所不同,但可能很难创建一个可读、易于理解/可维护且有用的案例案例(我没试过)。
想了想,我不确定这句话是否属实。要首先创建 VLA,编译器必须首先确定 VLA 需要的空间量。
对于sizeof,我们知道
如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。 (6.5.3.4/2)
虽然 VLA 大小显然是运行时确定的,但在对 VLA 声明符的大小表达式进行评估(如果有的话,包括任何副作用)之后:
可变长度数组类型的每个实例的大小在其生命周期内不会改变。如果 size 表达式是 sizeof 运算符的操作数的一部分,并且更改 size 表达式的值不会影响运算符的结果,则未指定是否计算 size 表达式。 (6.7.5.2/2)
所以,给定
#define count_of(arr) (sizeof(arr)/sizeof(arr[0]))
是否存在任何这样的宏的实际有效行为对于 VLA 与数组声明是一个常量表达式(即普通的旧的 C99 之前的固定大小数组)?
【问题讨论】:
标签: c language-lawyer