C中typeof((c)+ 1)是什么?

我遇到了C中的一个expression式

typeof((c) + 1) _tmp = c; 

这到底是什么意思?

谢谢回复。

只有一个疑问? 如果c的types是结构而不是原始types,那么会怎么样呢?

普通C(而不是C ++)中的typeof运算符是标准的GCC附加。 它告诉编译器你要使用圆括号中的expression式的types。

如上所述使用typeof ,可以使用另一个variables的types作为引用来声明您或者该上下文中未知types的variables。 它也可以用于铸造。

typeof+操作具有特殊的效果。 typeof((c) + 1)意思是“c的types或1的types,以升级之后的剩余者为准” 。 请记住,例如,当在涉及整数的操作中使用字符时,字符被提升为整数,整数被提升为浮动,浮动到双倍等。

所以, typeof(int_variable + char_variable)int ,因为char会被提升到int来执行操作。

请注意,只有编译器才能解决这个问题: typeof不计算,没有值,运行时没有任何反应。

typeof的完整描述可以在这里find 。

创buildvar _tmp st _tmptypes为_tmp (max)的c或者int ,并将其设置为c值。

例如

 char c -> int _tmp // char(c) + 1 is int float c -> float _tmp // float(c) + 1 is float 

这不是标准C. C没有types的东西(除非你正在处理用户定义的东西)。

typeof通常是一个编译器扩展(最有可能的是GCC编译器)。 你可以在这里读到它

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

除了另一个答案,这里的+很微妙。 它允许c是一个expression式或一个types。

  • 如果它是一个expression式,那么,如上所述, c被提升为int (至less),并且整个expression式的types至less具有int整数级别。
  • 如果它是一个typesexpression式,围绕c的圆括号使其成为+1值。 那么最终的types就是c

对于这两种杂技来说,重要的是c是算术types的,也要注意这里的这个技巧可能会失去c的符号性。 所以这种扩展types的使用并不像看起来那么有用。 在大多数情况下,使用uintmax_tintmax_t就足够了。

比较代码,

 typeof((c) + 1) _tmp = c; 

 typeof(c) _tmp = c; 

typeof允许types或variables的参数。 现在考虑一下c

  • struct { int a; int b }
  • 指向struct { int a; int b } struct { int a; int b }
  • 实际的文字int

以及根据uʍopǝpısdn 提升 char ,macros可以防止struct赋值。 所以下面的代码不会编译,

 struct { int a; int b } c; typeof((c)+1) _tmp = c; 

为了效率和代码大小的原因,人们可能希望禁止struct分配,特别是在通用的macros中。

Typeof返回一个types,并在编译时进行评估。

整个语句意味着声明与c(通常)相同types的variablestmp

它可能会声明一个相关或不同的types,因为c + 1的types可能与c不同。 (这在c ++中更可能)。

在我看来,只用于指针, typeof((c) + 1) = typeof(c); 所以这可能会保证传递参数是指针