以下はコンパイルに失敗します:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
しかし、私がそれを
sizeof(arr);
すべて順調。どうして?
6.5.3によると、sizeof
には次の2つの形式があります。
sizeof unary-expression
sizeof ( type-name )
あなたのコードのarr
はtype-name
、かっこで囲む必要があります。
これが言語の指定方法です。ここでは型名を括弧で囲む必要があります。
文法が次のようになっているとします。
_sizeof unary-expression
_ _sizeof type-name
_
今、例えば次の式はあいまいです。
_sizeof int * + 0
_
sizeof(int *) + 0
またはsizeof(int) * +0
のいずれかです。式に追加されたアスタリスクは式ではないため(ただし、一部の型名では、追加された型名も型名です)、このあいまいさは単項式では発生しません。
ここで何かを指定する必要があり、型名を括弧で囲む必要があることは、あいまいさを解決する方法です。