以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
但如果我将其更改为
sizeof(arr);
一切都很好。为什么呢?
答案 0 :(得分:111)
根据6.5.3,sizeof
有两种形式如下:
sizeof unary-expression
sizeof ( type-name )
由于代码中的arr
是type-name
,因此必须将其括起来。
答案 1 :(得分:39)
这就是指定语言的方式,类型名称必须在此处加上括号。
假设语法看起来像这样:
sizeof unary-expression
sizeof type-name
现在,例如以下表达式含糊不清:
sizeof int * + 0
可以是sizeof(int *) + 0
或sizeof(int) * +0
。一元表达式不会产生这种歧义,因为附加到表达式的星号不是表达式(但对于某些类型名称,附加一个,也是类型名称)。
这里必须指定一些东西,并且要求括号的类型名称是解决歧义的一种方法。
答案 2 :(得分:-3)
我认为这是因为你有typedef
。如果你删除它,它应该编译。
维基百科的例子:
/* the following code fragment illustrates the use of sizeof
* with variables and expressions (no parentheses needed),
* and with type names (parentheses needed)
*/
char c;
printf("%zu,%zu\n", sizeof c, sizeof (int));