2012-07-16 2 views
8

GNUC C에서는 typeof(expression)을 사용할 수 있으며 부작용이있는 표현식을 사용할 수 있습니다. 예를 들어 당신이 C 코드를 가질 수 있도록이 경우typeof() 표현식 내 부작용

int x = 0; 
typeof(x++) y; 

을, 측면 효과 (유형은 컴파일 시간이 유일한만큼이 말이) 무시 x는 여전히 제로 이후입니다.

그러나 GCC documentation 말한다 : 대해서 typeof의

피연산자는 부작용 경우에만이 가변적으로 개질 형 의 발현 또는 같은 종류의 이름 인 경우에 대해 평가된다.

이 문장의 의미는 무엇입니까? 부작용이있는 typeof을 작성하고 실제로 런타임에 부작용을 실행하게 할 수 있습니까? 나를 위해,이 문장은 이것을 나타냅니다.

+0

http://stackoverflow.com/q/4436889/195488 –

+1

@ 0A0D이 질문은 'typeof'에 대해서도 말하지만 부작용은 언급하지 않고 부작용이없는 표현 만 언급합니다. –

+0

@PhilippWendler : 좋은 질문입니다! – pje

답변

9

예, 경우에 따라 typeof 내부에 부작용이있을 수 있습니다. 설명서에 나와 있듯이 "가변적으로 수정 된 유형"내에 있어야합니다. 이것은 런타임 값에 따라 달라지는 유형입니다 (예 : int[x]).

그래서 다음 코드는 합법적 입력 int[1] 될 y를 선언하고 x는 이후에 값 1이 : 물론

int x = 0; 
typeof(int[++x]) y; 

, 일반적으로 동등하게 다양하게 수정하는 유형을이 법적 아니라 로컬 변수 선언 (내부 함수).

+3

이것은'sizeof'와 동일합니다 : 가변 길이 배열이 나타나고 배열 크기의 값이'sizeof' 표현식의 결과에 영향을주는 경우를 제외하고 표현식 피연산자는 평가되지 않습니다. – ouah