Почему (и когда) мне нужно использовать скобки после sizeof? - PullRequest
73 голосов
/ 05 мая 2011

Ниже не удается скомпилировать:

typedef int arr[10];
int main(void) {
    return sizeof arr;
}

sizeof.c:3: error: expected expression before ‘arr’

, но если я изменю его на

sizeof(arr);

, то все в порядке.Почему?

Ответы [ 3 ]

111 голосов
/ 05 мая 2011

Согласно 6.5.3 для sizeof существуют две формы:

sizeof unary-expression
sizeof ( type-name )

Поскольку arr в вашем коде - type-name, его необходимо заключить в скобки.

39 голосов
/ 02 ноября 2014

Так указывается язык, здесь имена типов должны быть заключены в скобки.

Предположим, грамматика выглядела так:

sizeof <i>unary-expression</i> sizeof <i>type-name</i>

Теперь, например, следующее выражение будет неоднозначным:

sizeof int * + 0

Это может быть либо sizeof(int *) + 0, либо sizeof(int) * +0. Эта двусмысленность не возникает для унарных выражений, поскольку звездочка, добавляемая к выражению, не является выражением (но для некоторых имен типов, добавление одного снова является именем типа).

Что-то нужно было указать здесь, и требование заключить в скобки имена типов - способ решить эту двусмысленность.

0 голосов
/ 18 февраля 2017

Я думаю, это потому, что у вас есть 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));
...