typeof()表达式中的副作用

在GNUC C中,您可以使用typeof(expression) ,并且使用内部具有副作用的表达式是合法的。 例如,你可以拥有这个C代码:

 int x = 0; typeof(x++) y; 

在这种情况下,副作用被忽略,之后x仍然为零(这是有道理的,因为类型只是编译时的事情)。

但是, 海湾合作委员会的文件说:

当且仅当它是可变修改类型的表达式或这种类型的名称时,才评估typeof的操作数的副作用。

这句话是什么意思? 是否真的可以编写带有副作用的typeof并且实际上在运行时执行副作用? 对我来说,这句话似乎表明了这一点。

是的,在某些情况下,有可能在评估类型内部产生副作用。 正如文档所说,它需要在“可变修改类型”内。 这是一种取决于某些运行时值的类型,例如int[x]

因此,以下代码是合法的,声明y为int[1]类型,x后面的值为1:

 int x = 0; typeof(int[++x]) y; 

当然,对于一般的可变修改类型,这仅对局部变量声明(内部函数)是合法的。