변수 선언의 시점때문에 에러가 날수도 있나요?
글쓴이: 임종규 / 작성시간: 월, 2005/11/14 - 8:54오후
에러가 발생한 코드..(a 코드)
void func(user_type_a a) { if (a == NULL) { return; } user_type_b b; .... }
에러가 발생하지 않는 코드.. (b 코드)
void func(user_type_a a) { /* null 체크 부분만 생략 */ user_type_b b; .... }
에러가 발생하지 않는 코드... (c 코드)
void func(user_type_a a) { user_type_b b; if (a == NULL) { return; } .... }
처음에 a 코드를 컴파일을 했는데 user_type_b 부분에서부터
Quote:
user_type_b : illegal use of this type as an expression
라는 에러를 발생하더군요.
왜 컴파일 에러가 발생하는지 한참을 찾아봤지만 알수가 없었습니다.
담배하나 피고 와서 혹시나 하는 생각에 b 코드처럼 앞부분의 null 체크부분만을 삭제하고 다시 컴파일을 해봤습니다.
그런데 다행인지 모르지만 에러가 나지 않더군요.
혹시 우연일지도 모른다는 생각에 다시 null 체크부분을 넣어보니 다시 에러를 보여주더군요.
다시 혹시나 하는 생각에 c 코드처럼 자리만 바꾸어 컴파일 해보았습니다.
에러가 안 납니다 :?
컴파일러는 vc++ 6.0 sp4 입니다.
그리고 user_type_a, user_type_b 의 선언에서 서로 상관되는 것은 전혀 없습니다. 또한 두 타입 모두 포인터 타입을 typedef 하여 사용한 것입니다.
확장자는 .c 입니다.
1. 왜 저런 에러를 보여줍니까?
2. 변수 선언의 시점이 에러를 발생할수도 있습니까?
Forums:
확장자가 c의 경우에는 c 언어로 컴파일을 하게 됩니다.c언어의 경우
확장자가 c의 경우에는 c 언어로 컴파일을 하게 됩니다.
c언어의 경우에는 변수는 항상 블럭의 맨 처음에 위치해야만 하도록 되어있습니다..
따라서 모든 변수의 선언을 블럭의 맨 처음에 위치하도록 고치시거나..
c++의 경우에는 블럭의 중간에도 변수 선언이 허용 되므로 확장자를 cpp로 바꾸시어 c++로 컴파일을 하게 되면 에러가 없을 것입니다.
그런데 c언어의 경우에는 블럭의 맨 처음에만 위치하면 되기 때문에 아래와 같이 쓰신다면 중간에 변수 선언이 가능합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
Re: 변수 선언의 시점때문에 에러가 날수도 있나요?
저 C99이전에는 모든 변수를 블록의 제일 앞에 선언을 해 두고 시작하셔야 하는데요 ^^ 그것 때문인것 같습니다
C++, 그리고 C++....
죽어도 C++
네..
답변 감사합니다. :)
/* How to Love Others */
while(GetDepth(Love) < Enough) DoLove();
댓글 달기