time 질문입니다.

jee89의 이미지

#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; 으로 변수이름을 바꾸면
이상이없네요.
왜그런가요?

jemiro의 이미지

time.h에
time_t time(time_t *t);

뭐 이런씩으로 time함수가 선언이 되어 있을테니,

time_t time; 이라고 정의 해도.

time = time(NULL);에서
왼쪽의 time은 변수 time이 아니라.
함수 포인터 time이 되어 버리는 것입니다.

그래서 포인터에다가 정수를 대입하려고 하니 에러가 날수 밖에요.

arimae의 이미지

main 함수내의 time 이라는 것은 함수가 아니라 변수가 됩니다.

다음의 예를 보면

int a; // 전역변수

int main(void)
{
    int a;  // 지역변수
}

위의 경우 main 함수내의 int a가 있고 전역 변수에 int a 가 있습니다.
이 경우 main 함수내에서 a를 사용할 경우 지역변수 a를 사용하게 됩니다.

실제 예를 들어보면

#include <stdio.h>

void func1(void);
void func2(void);

int a = 4;

int main()
{
    func1();
    func2();

    return 0;
}

// use local variable
void func1(void)
{
    int a = 6;

    fprintf(stderr, "func1 part\n");
    fprintf(stderr, "a address = %x\n", &a);
    fprintf(stderr, "a value = %d\n", a);
}

// use global variable
void func2(void)
{
    fprintf(stderr, "func2 part\n");
    fprintf(stderr, "a address = %x\n", &a);
    fprintf(stderr, "a value = %d\n", a);
}

결과
[arimae@ts arimae]$ ./a.out 
func1 part
a address = bffffb04
a value = 6
func2 part
a address = 804957c
a value = 4

위의 경우 func1 에서는 지역변수 a를 사용하게 되고 func2 에서는 전역변수 a를 사용하게 됩니다.
이처럼 같은 이름을 가지는 symbol 이 있을 경우 가장 최근에 nested 된 블록의 것을 사용하게 됩니다.

위의 time 의 경우도 마찬가지 입니다. main 함수내에 있는 time_t time 이라는 선언이 함수 time 을 가리기 때문에 함수가 아닌것을 호출하여 위와 같은 에러를 내는것입니다.

비슷한 예를 살펴보죠. 우리의 눈에 익은 printf 입니다.

#include <stdio.h>

void func1(void);
void func2(void);

int main()
{
    func1();
    func2();

    return 0;
}

// use local printf variable
void func1(void)
{
    int printf = 5;

    fprintf(stderr, "func1 part\n");
    fprintf(stderr, "printf address = %x\n", &printf);
    fprintf(stderr, "printf value = %d\n", printf);
}

// use printf function
void func2(void)
{
    int (*func)(const char *, ...);
    func = printf;

    fprintf(stderr, "func2 part\n");
    fprintf(stderr, "printf address = %x\n", func);
    fprintf(stderr, "printf value = %d\n", func("Printf Function!!\n"));
}

// 결과
[arimae@ts arimae]$ ./a.out 
func1 part
printf address = bffffb04
printf value = 5
func2 part
printf address = 8048364
Printf Function!!
printf value = 18

위의 예를 보면 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..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.