C中的typeof真的是一个操作符吗?我在想,因为C中没有多态性,所以在运行时没有什么可做的。也就是说,typeof的答案在编译时已知。(我想不出在编译时不知道typeof的用法。)所以它看起来更像是一个编译时指令,而不是一个运算符。typeof是否使用任何(处理器)运行时(在GCC中)?
czq61nw11#
由于typeof是一个编译器扩展,因此没有真正的定义,但在C的传统中,它将是一个运算符,例如sizeof和_Alignof也被视为运算符。你错了,C有只在运行时确定的动态类型:变量修改(VM)类型。
typeof
sizeof
_Alignof
size_t n = strtoull(argv[1], 0, 0); double A[n][n]; typeof(A) B;
字符串只能在运行时确定。2021年新增:具有与sizeof相似规则的typeof很有可能进入C23。
doinxwow2#
这是一个GNU扩展。简而言之,这是一种方便的方法来声明一个对象与另一个对象具有相同的类型。举例来说:
int x; /* Plain old int variable. */ typeof(x) y; /* Same type as x. Plain old int variable. */
字符串它完全在编译时工作,主要用于宏。依赖于typeof的宏的一个著名例子是container_of。
container_of
niknxzdl3#
它是GCC编译器的C扩展,参见this。
4uqofj5v4#
它不是一个操作符,而是一个关键字。不,它不做任何运行时魔术。
eqzww0vc5#
需要使用此扩展的一种情况是获取匿名结构体的指针。您可以检查此this question作为示例。
5条答案
按热度按时间czq61nw11#
由于
typeof
是一个编译器扩展,因此没有真正的定义,但在C的传统中,它将是一个运算符,例如sizeof
和_Alignof
也被视为运算符。你错了,C有只在运行时确定的动态类型:变量修改(VM)类型。
字符串
只能在运行时确定。
2021年新增:具有与
sizeof
相似规则的typeof
很有可能进入C23。doinxwow2#
这是一个GNU扩展。简而言之,这是一种方便的方法来声明一个对象与另一个对象具有相同的类型。举例来说:
字符串
它完全在编译时工作,主要用于宏。依赖于
typeof
的宏的一个著名例子是container_of
。niknxzdl3#
它是GCC编译器的C扩展,参见this。
4uqofj5v4#
它不是一个操作符,而是一个关键字。不,它不做任何运行时魔术。
eqzww0vc5#
需要使用此扩展的一种情况是获取匿名结构体的指针。您可以检查此this question作为示例。