Почему (и когда) мне нужно использовать скобки после sizeof?
ниже не удается скомпилировать:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
но если я изменю его на
sizeof(arr);
все нормально. Зачем?
3 ответа:
согласно 6.5.3, есть две формы для
sizeof
следующим образом:sizeof unary-expression sizeof ( type-name )
С
arr
в вашем коде этоtype-name
, он должен быть заключен в скобки.
именно так указывается язык, имена типов должны быть заключены в скобки здесь.
предположим, что грамматика выглядит так:
sizeof unary-expression
sizeof type-name
сейчас, например, следующее выражение будет неоднозначным:
sizeof int * + 0
Это может быть либо
sizeof(int *) + 0
илиsizeof(int) * +0
. Эта двусмысленность не возникает для унарных выражений, поскольку звездочка, добавленная к выражению, не является выражением (но для некоторых имен типов, добавляющих один, снова является типом имя.)что-то должно было быть указано здесь, и требование, чтобы имена типов были заключены в скобки, - это способ решить двусмысленность.
Я думаю, это потому что у вас есть
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));