gcc-C中的typeof((c)+ 1)是什么

我遇到了一个像C的表达式

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

这到底是什么意思?

谢谢回复。

只是一个疑问? 如果c的类型是struct而不是基本类型,那+1怎么办?

zombie asked 2020-07-30T17:11:26Z
7个解决方案
56 votes

普通C(不是C ++)中的typeof运算符是对该标准的GCC补充。 它告诉编译器您要使用括号中包含的表达式的类型。

使用上述typeof,可以使用另一个变量的类型作为引用来声明您自己或在此上下文中类型未知的变量。 它也可以用于铸造。

int内部的typeof操作具有特殊效果。 char的意思是“ c的类型或1的类型,升序后仍保留”。 请记住,例如,在涉及int的操作中使用char时,会将char提升为int,将int提升为float,将float提升为double,等等。

因此,typeofint,因为char将升级为int以执行该操作。

请注意,只有编译器才能解决此问题:typeof不评估,没有价值,在运行时什么也没有发生。

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

slezica answered 2020-07-30T17:12:06Z
5 votes

create var _tmp st _tmp的转换类型(最大值)为cint,并将其设置为c的值。

例如

char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
Anycorn answered 2020-07-30T17:12:31Z
4 votes

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

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

[HTTP://GCC.弓弩.org/online doc S/GCC/type of.HTML]

AnT answered 2020-07-30T17:13:00Z
4 votes

除了其他答案外,此处的c非常微妙。 它允许c是表达式或类型。

  • 如前所述,如果它是一个表达式,c被提升为c(至少)以及整个表达式的类型至少具有typeof的整数等级。
  • 如果是类型表达式c周围的括号使其成为转换为c。因此,结果类型仅为typeof

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

Jens Gustedt answered 2020-07-30T17:13:34Z
4 votes

比较代码,

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

typeof(c) _tmp = c;

struct允许使用类型或变量的参数。 现在考虑struct

  • struct
  • 指向struct的指针
  • 实际文本struct

除了按照每位用户升级struct之外,该宏还可以防止struct的分配。 因此以下代码将无法编译,

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

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

artless noise answered 2020-07-30T17:14:20Z
1 votes

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

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

因为c + 1的类型可以不同于c,所以它可以声明相关或不同的类型。 (在c ++中这种可能性更大)。

Alex Brown answered 2020-07-30T17:14:49Z
1 votes

我认为,仅对于指针typeof((c) + 1) = typeof(c);,这样可以确保传递的参数是指针

chaser123 answered 2020-07-30T17:15:09Z
translate from https://stackoverflow.com:/questions/4436889/what-is-typeofc-1-in-c