【问题标题】:Side effects within a typeof() expressiontypeof() 表达式中的副作用
【发布时间】:2012-07-16 12:47:29
【问题描述】:

在 GNUC C 中,您可以使用typeof(expression),并且在内部使用带有副作用的表达式是合法的。因此,例如,您可以使用以下 C 代码:

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

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

但是,GCC documentation 说:

计算 typeof 的操作数的副作用 当且仅当它是可变修改类型的表达式 或此类类型的名称。

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

【问题讨论】:

  • @0A0D 那个问题也谈到了typeof,但没有提到副作用,只有无副作用的表达方式。
  • @PhilippWendler:好问题!

标签: c gcc


【解决方案1】:

是的,在某些情况下,可能会在 typeof 内评估副作用。正如文档所说,它需要在“可变修改类型”内。这是一个依赖于一些运行时值的类型,例如int[x]

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

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

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

【讨论】:

  • 请注意,这与sizeof 相同:除非出现可变长度数组并且数组大小的值影响sizeof 表达式的结果,否则不会计算表达式操作数。
猜你喜欢
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多