time 질문입니다.
글쓴이: jee89 / 작성시간: 목, 2003/01/16 - 2:43오후
#include <stdio.h>
#include <time.h>
int main()
{
time_t time;
time = time( NULL );
fprintf( stderr , "%s" , ctime( &time ) );
return 0;
}
컴파일하면
"b29.c", line 7 function designator is not of function type
"b29.c", line 7 warning improper pointer/integer combination op "="
와 같은 에러가 발생하고,
time_t time ---> time_t tm; 으로 변수이름을 바꾸면
이상이없네요.
왜그런가요?
Forums:
함수명과 변수명이 중복 되면 안됩니다.
time.h에
time_t time(time_t *t);
뭐 이런씩으로 time함수가 선언이 되어 있을테니,
time_t time; 이라고 정의 해도.
time = time(NULL);에서
왼쪽의 time은 변수 time이 아니라.
함수 포인터 time이 되어 버리는 것입니다.
그래서 포인터에다가 정수를 대입하려고 하니 에러가 날수 밖에요.
main 함수내의 time 이라는 것은 함수가 아니라 변수가 됩니다.
main 함수내의 time 이라는 것은 함수가 아니라 변수가 됩니다.
다음의 예를 보면
위의 경우 main 함수내의 int a가 있고 전역 변수에 int a 가 있습니다.
이 경우 main 함수내에서 a를 사용할 경우 지역변수 a를 사용하게 됩니다.
실제 예를 들어보면
위의 경우 func1 에서는 지역변수 a를 사용하게 되고 func2 에서는 전역변수 a를 사용하게 됩니다.
이처럼 같은 이름을 가지는 symbol 이 있을 경우 가장 최근에 nested 된 블록의 것을 사용하게 됩니다.
위의 time 의 경우도 마찬가지 입니다. main 함수내에 있는 time_t time 이라는 선언이 함수 time 을 가리기 때문에 함수가 아닌것을 호출하여 위와 같은 에러를 내는것입니다.
비슷한 예를 살펴보죠. 우리의 눈에 익은 printf 입니다.
위의 예를 보면 func1 에서는 printf 함수가 지역 변수인 printf 로 대체되었습니다. 따라서 func1에서는 printf가 함수가 아니고 변수인 셈입니다.
func2 에서는 주소를 출력하기 위해 함수의 포인터인 func 를 사용하였습니다. 이것을 이용해서 printf 함수의 출력해보면 func1 에서의 주소와 다르다는 것을 알 수 있습니다. 즉 func1의 printf 와 func2의 printf는 이름은 같지만 서로 다른 심볼을 가르킨다는 의미입니다.
이런것을 피하시려면 함수 이름과 같은(전역변수도 마찬가지입니다.) 지역변수를 사용하면 안되겠죠.
결론을 내리면 time 은 main 함수내에서 time_t time 이라는 선언때문에 변수가 됩니다. 근데 time = time(NULL) 이라는 호출은 변수인 time 을 함수처럼 호출하였기 때문에 에러가 발생하는 것입니다.
Dream, Passion and Challenge..
댓글 달기