사용자 정의 자료형 선언에 관해서..

shs0917의 이미지

비쥬얼 스튜디오 C++에서는 이상없이 작동하는데..
리눅스에서 gcc로 컴파일 하니까.. typedef가 정의되지
않았다는 에러가 납니다.

typedef struct list{
    int data;
    list *link;
};

int main(void){
    list item1, item2, item3;
    .......


    return 0;
}

너무 초보적인 질문 같지만.. 답변 부탁 드립니다.

차리서의 이미지

typedef struct _node {
        int      data;
        list    *link;
} list;

int
main(void)
{
        list    *item1, *item2, *item3;
        .......

        return (0);
}

아닐까요?

--
자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!

wafe의 이미지

C++에서 struct는 기본 모드가 public인 class와 같다고 생각하시면 됩니다. (class는 기본으로 private이죠) 그래서 그냥

struct list {
  ...
};

라고 쓰시면 됩니다. typedef는 필요없습니다.

C 에서는

typedef struct {
 ...
} list;

이렇게 해야 list 가 타입 이름으로 선언됩니다.

Heejoon Lee

shs0917의 이미지

먼저 답변 정말 감사드립니다.
근데... 해봤는데 안되는군요..
그리고.. 제가 올린 코드가 제 생각에는 아무리 봐도 신텍스에러가
아닌거 같은데.. 대체 뭐가 문제인지.. VC++ 6.0에서는
컴파일이 잘되공.. 그래서.. 결국엔 윈도에서 컴파일을 했습니다..
다른 문제인거 같은데.. 아시는분 답변 부탁 드립니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

galadriel의 이미지

typedef가 struct안에서 설정할때 안먹힙니다..

버그인지 뭔지는 잘 모르겠으나


typedef struct list {
    int data;
    list *link;  --> 이부분이 문제 .!
};

이렇게 바꿔야 합니다.

typedef struct _list  {
    int data;
    struct _list *link;
}LIST;

이런식으로

왜 이런지는 잘 몰라요..typedef문이 처리 되는 순서 때문인가??-_-ㅋ

galadriel in the tower of elves

shs0917의 이미지

이렇게 사용하는것이 자기참조방식이라고 알고 있는데..
저렇게 구조체명 따로.. 사용자 정의형 이름이 따로..
이름이 달라야 한다는게 이해가 안가네요..
제가 표현력이 좀 부족해서.. C++에서만 가능한건지..
의문이 생기는군요..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

galadriel의 이미지

6.7.2.3 Tags에 관한 내용을 보면

Quote:

All declarations of structure, union, or enumerated tyopes that have the same scope and use the same tag declare the same type, The type is [incomplete] untile the closing brace of the list defining the content, and complete thereafter.

Quote:

incomplete : An incomplete type may only by used when the size of an object of that type is not needed. It is not needed, for example, when a typedef name is declared to be a specifier for a structure or union, or when a pointer to or a function returning a structure or union is being declared. The specification has to be complete before such a function is called or defined.

라고 나오네요... 결론적으로 struct 선언하면서 typedef가 되는데 typedef라는 놈은 struct가 다 선언되야지 유효하다는 것인거 같군요.

예시로 나온 코드를 보면

typedef struct tnode TNODE;
struct tnode {
    int count;
    TNODE *left, *right;
};

TNODE s, *sp;

이런식의 예제 코드가 붙는군요.

C99스펙을 하드카피 해놨더니 써먹을 때가 있군요 8)

galadriel in the tower of elves

wafe의 이미지

혹시나 하는 마음에, 일단 typedef에 대해서 설명하겠습니다.

typedef A B

하면 A라는 타입을 B라는 타입으로 쓸 수 있는 겁니다. 이것을
typedef struct _list {
  ...
} list;

에 적용하면 A는
struct _list {
  ...
};

이고 B는
list

입니다.

이렇게 풀어서 써도 같은 의미입니다.

struct _list {
  ...
};
typedef struct _list list;

이름 없는 구조체도 가능하므로

typedef struct {
  ...
} list;

이렇게 써도 됩니다.

그리고 질문하신 코드는 구조체를 정의하면서 그 안에 자기 자신을 포함하는 경우인데요. 이 경우에는 typedef를 위에다 먼저 한 후에 써야합니다. 즉,

typedef struct _list list;
struct _list {
  ...
};

이렇게 정의해야합니다.

Heejoon Lee

shs0917의 이미지

답변 달아주신 모든 분들께 감사드립니다.
해결이 되었네요.. :D
C++ 컴파일러로는 절대로 C 코딩을 하지 말아야 겠습니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

pynoos의 이미지

shs0917 wrote:
답변 달아주신 모든 분들께 감사드립니다.
해결이 되었네요.. :D
C++ 컴파일러로는 절대로 C 코딩을 하지 말아야 겠습니다.

정확히 알면 어떤 연장을 쓰던지 목적을 달성할 수 있습니다.
마음속에 연장에 대한 쓰임새를 규정하지 마세요..

juicy의 이미지

shs0917 wrote:
비쥬얼 스튜디오 C++에서는 이상없이 작동하는데..
리눅스에서 gcc로 컴파일 하니까.. typedef가 정의되지
않았다는 에러가 납니다.
typedef struct list{
    int data;
    list *link;
};

int main(void){
    list item1, item2, item3;
    .......


    return 0;
}

너무 초보적인 질문 같지만.. 답변 부탁 드립니다.

이 코드는 표준 C나 표준 C++ 문법으로 좀 틀린 문법입니다.
(정확히 syntax보다 semantic이 틀렸죠..)
위에서 지적했듯이 미처 정의가 끝나지 않은 구조체를 쓰려고 한 것이 잘못이지요.
그러나 Visual Studio 의 C++ compiler(CL.EXE)는 나름대로 융통성을 발휘해서 그것을 허용하는가봅니다.
아마 경고(warning) 정도는 뜨지 않았을까요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.