Why (and when) do I need to use parentheses after sizeof?
That's the way the language is specified, type names must be parenthesized here.
Suppose the grammar looked like this:
sizeof unary-expression
sizeof type-name
Now, e.g. the following expression would be ambiguous:
sizeof int * + 0
It could be either sizeof(int *) + 0
or sizeof(int) * +0
. This ambiguity doesn't arise for unary expressions, as an asterisk appended to an expression isn't an expression (but for some type names, appending one, is again a type name).
Something had to be specified here and requiring type-names to be parenthesized is a way to solve the ambiguity.
I think it's because you have typedef
. If you remove it, it should compile.
Example from 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));