아래는 컴파일에 실패합니다.
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
하지만 내가 그것을 변경하면
sizeof(arr);
모든 것이 좋습니다. 왜?
답변
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));