65

C中的typeof真的是运算符吗?
我在想,因为 C 中没有多态性,所以在运行时无事可做。也就是说,typeof 的答案在编译时是已知的。(我想不出在编译时不会知道的 typeof 的使用。)所以它似乎更像是一个编译时指令,而不是一个运算符。

typeof 是否使用任何(处理器)运行时(在 GCC 中)?

4

5 回答 5

81

由于typeof是编译器扩展,因此并没有真正的定义,但在 C 的传统中,它将是一个运算符,例如sizeof_Alignof也被视为一个运算符。

而且您误会了,C 具有仅在运行时确定的动态类型:变量修改 (VM) 类型。

size_t n = strtoull(argv[1], 0, 0);
double A[n][n];
typeof(A) B;

只能在运行时确定。

在 2021 年加入:很有可能typeof采用与 for 类似的规则sizeof将其纳入 C23。

于 2012-08-22T22:02:38.043 回答
34

这是一个 GNU 扩展。简而言之,这是一种声明与另一个具有相同类型的对象的便捷方式。例如:

int x;         /* Plain old int variable. */
typeof(x) y;   /* Same type as x. Plain old int variable. */

它完全在编译时工作,主要用于宏。宏依赖的一个著名例子typeofcontainer_of.

于 2012-08-22T21:15:51.863 回答
9

它是 GCC 编译器的 C 扩展,参见http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

于 2012-08-22T21:15:23.200 回答
5

它不完全是一个运算符,而是一个关键字。不,它不会做任何运行时魔法。

于 2012-08-22T21:15:51.620 回答
0

您需要使用此扩展的一种情况是获取匿名结构的指针。您可以查看this question作为示例。

于 2021-10-26T13:21:56.513 回答