Почему (и когда) мне нужно использовать скобки после sizeof?


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

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

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

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

sizeof(arr);

все нормально. Зачем?

3 66

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));