什么是C中的((c)+ 1)类型

时间:2010-12-14 07:38:29

标签: c gcc

我在C中遇到了一个表达式

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

这究竟是什么意思?

感谢您的回复。

只有一个疑问?如果c的类型是struct而不是基本类型,那么+1会做什么?

7 个答案:

答案 0 :(得分:56)

普通C(非C ++)中的typeof运算符是标准的GCC添加。它告诉编译器你想要使用括号括起来的表达式的类型。

如上所述使用typeof,您可以使用另一个变量的类型作为参考,声明您或该上下文中未知类型的变量。它也可以用于铸造。

+内的typeof操作具有特殊效果。 typeof((c) + 1)表示“c的类型,或者1的类型,在促销后保留的任何一种”。请记住,例如,当在涉及整数的操作中使用字符时,字符会被提升为整数,整数会被提升为浮点数,浮点数会被提升为双精度数等。

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

请注意,只有编译器可以解决这个问题:typeof没有评估,它没有值,在运行时没有任何反应。

typeof的完整说明可以是found here

答案 1 :(得分:5)

创建var _tmp st _tmp的类型为cint的upcast(最大值),并将其设置为c的值。

例如

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:4)

除了另一个答案,这里的+非常微妙。它允许c是表达式或类型。

  • 如果是表达,那么,如上所述, c被提升为int(至少) 和整个表达的类型 至少具有整数等级int
  • 如果是类型表达式的话 围绕c的括号使它成为一个 值为+1的强制转换。那么结果类型只是c

对于这两种杂技,重要的是c是算术类型,并且还要注意这里的这个技巧可能会失去c的签名。因此,typeof扩展名的使用并不像它看起来那么有用。在大多数情况下,使用uintmax_tintmax_t就足够了。

答案 4 :(得分:4)

比较代码,

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

typeof(c) _tmp = c;

typeof允许类型或变量的参数。现在将c视为

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

根据uʍop ǝpısdn 促销 char ,宏可以防止struct分配。所以下面的代码不会编译,

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

由于效率和代码大小原因,人们可能希望禁止struct分配,尤其是在通用宏中。

答案 5 :(得分:1)

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

整个语句意味着声明一个变量tmp,其类型与c(通常)相同。

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

答案 6 :(得分:1)

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