【发布时间】:2018-04-28 02:45:50
【问题描述】:
在下面的代码中,test 和 test2 函数是等价的吗?
typedef int rofl;
void test(void) {
rofl * rofl = malloc(sizeof(rofl)); // Is the final rofl here the TYPE?
}
void test2(void) {
rofl * rofl = malloc(sizeof *rofl); // Is the final rofl here the VARIABLE?
}
换句话说:
- 由于括号,
sizeof(rofl)中的rofl是否正确选择了rofl类型? - 由于缺少括号,
sizeof *rofl中的rofl是否正确选择了rofl变量?
注意:这是一个看起来很傻的示例,但实际上可能会发生您的类型名称与变量名称相同的情况。因此问题。
【问题讨论】:
-
为什么人们投了反对票?这是一个完全合理的问题,鉴于 C 确实有多个名称空间,因此某些名称可以有多个可见的含义,因此您无法明确回答这个问题,除非您明确知道 typedef 名称和对象名称共享相同的命名空间,可以相互隐藏。
-
简短的回答是否定的,括号没有区别。
sizeof是一个运算符,而不是一个函数,所以括号只是多余的。 -
顺便说一句,要明确回答您的问题 2,是的,缺少括号会迫使
sizeof操作数只有一个选项:它必须是某种“一元表达式”,所以它不能是 typedef 名称。关于问题 1,括号不会导致编译器需要 typedef 名称。括号里的东西,如果它只是一个标识符,在那个时候只能是一个typedef、函数或对象的名称,所以编译器只会找到一个解析;它不需要选择。 -
@EricPostpischil 你自相矛盾。括号要么有区别,要么没有。 unary-expression 可以是一个标识符。
-
@EJP:没有矛盾。当括号存在时,有两个句法选项是可能的。当括号不存在时,只有一个句法选项。使用括号中的标识符,
sizeof (foo)可以匹配 C 标准第 6.5.3 条中显示的“sizeofunary-expression”或“sizeof (type-name)” 在同一子句中。然后根据标识符的含义而不是本地语法来确定匹配。没有括号,只有第一个是可能的。
标签: c sizeof unary-operator