typedef struct 문에 관한 질문.

canuyes의 이미지

코드를 읽던중에,

typedef struct{double x,y;} point_t,*point;

와 같은 문법을 보게되었습니다.

뭐라고 구글링 할지도 너무 애매하기에 여기에 질문올립니다.

대게 typedef 선언 뒤에 오는 것은 1개 아닌가요?

point_t, *point(심지어 두번째것은 포인터로) 가 의미하는 것이 무엇인가요?

chanik의 이미지

무명 구조체(unnamed struct)에 대해 타입 정의와 포인터타입 정의를 한 번에 한 것입니다.
원래는 구조체 정의시 아래와 같이 구조체이름(예: tag_point)을 주어 정의하고
typedef로 타입 정의할 때 그 이름을 이용해서 정의할 수 있지만,
이 경우 결국 쓰지도 않을 tag_point라는 구조체 이름을 굳이 만들어내야 하므로
타자 치기도 귀찮고 코드도 번거롭게 보입니다.

struct tag_point {double x,y;};              /* named struct인 struct tag_point 정의 */
typedef struct tag_point point_t;            /* 구조체에 대해 point_t 타입 정의 */
typedef struct tag_point *point;             /* 구조체의 포인터에 대해 point 타입 정의 */

좀 줄여서 아래와 같이 두 개의 typedef를 한 번에 할 수도 있겠죠.

struct tag_point {double x,y;};              /* named struct인 struct tag_point 정의 */
typedef struct tag_point point_t, *point;    /* 구조체 타입과 포인터 타입 한번에 정의 */

구조체 정의와 typedef를 합치면 아래와 같이 될 것입니다.

/* named struct인 struct tag_point 정의. 동시에 그 타입과 포인터 타입도 정의 */
typedef struct tag_point {double x,y;} point_t, *point;

여기서 군더더기일수 있는 구조체 이름(tag_point)을 없애면, 질문하신 정의가 되는 것이죠.

/* unnamed struct 타입과 그 포인터 타입을 정의 */
typedef struct {double x,y;} point_t, *point;

앞에 이미 예가 나왔지만, typedef에는 타입 이름을 여러 개 주어도 됩니다.
아래 정의는 동일한 구조체에 대해 point_t와 dot_t 타입을 정의하고
동시에 각각의 포인터 타입인 point와 dot까지 정의한 것입니다.

typedef struct {double x,y;} point_t, *point, dot_t, *dot;

아래와 같이 두 타입간 혼용도 가능하네요. (gcc-4.4에서 해봄)

#include <stdio.h>
 
typedef struct tag_point{double x,y;} point_t, *point, dot_t, *dot;
 
int main()
{
    point_t p = {1234.532, 42334.321};
    dot_t   d = p;    /* dot_t 변수에 point_t 값 할당 */
    printf("%f, %f\n", d.x, d.y);
 
    dot    pd = &p;   /* dot   변수에 point_t 포인터 할당 */
    printf("%f, %f\n", pd->x, pd->y);
 
    return 0;
}

익명 사용자의 이미지

typedef는 변수 선언문에 붙이면 변수 이름으로 타입을 정의해 줍니다. 아주 간단하죠.

따라서, 변수 여러개를 한꺼번에 선언하듯이, 타입도 한꺼번에 여러개를 선언할 수 있습니다.

예를 들어, 다음은 변수 a와 b를 선언하는 코드입니다.

int a, b;

여기 맨 앞에 typedef 키워드를 붙이면, 변수 대신에 타입을 선언해 줍니다.

typedef int a, b;

타입 a와 b를 선언하죠.

struct {double x,y;} point_t,*point;

이것은 변수 point_t와 포인터 변수 point를 선언합니다.

typedef struct {double x,y;} point_t,*point;

이것은 타입 point_t와 point를 선언해 줍니다.

댓글 달기

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