Perché (e quando) devo usare parentesi dopo sizeof?

Il sotto non riesce a compilare:

typedef int arr[10]; int main(void) { return sizeof arr; } sizeof.c:3: error: expected expression before 'arr' 

ma se lo cambio

 sizeof(arr); 

va tutto bene. Perché?

Secondo 6.5.3, ci sono due forms per sizeof come segue:

 sizeof unary-expression sizeof ( type-name ) 

Dato che arr nel tuo codice è un type-name , deve essere tra parentesi.

Questo è il modo in cui viene specificata la lingua, i nomi dei tipi devono essere tra parentesi qui.

Supponiamo che la grammatica abbia questo aspetto:

sizeof unary-expression sizeof type-name

Ora, ad esempio, la seguente espressione sarebbe ambigua:

 sizeof int * + 0 

Potrebbe essere sizeof(int *) + 0 o sizeof(int) * +0 . Questa ambiguità non si presenta per le espressioni unarie, poiché un asterisco aggiunto ad un’espressione non è un’espressione (ma per alcuni nomi di tipi, l’aggiunta di uno, è ancora un nome di tipo).

Qualcosa doveva essere specificato qui e richiedere che i nomi dei tipi da parentesi siano un modo per risolvere l’ambiguità.

Penso che sia perché hai typedef . Se lo rimuovi, dovrebbe essere compilato.

Esempio da wikipedia:

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