Programming/C&C++

[C언어] typedef struct

bemaru 2014. 11. 29. 14:19
반응형

@구조체 선언

-구조체의 선언은 struct키워드와 tag이름으로 시작, 중괄호의 끝은 반드시 세미콜론(;)으로 끝나야 한다.

-선언 : 메모리공간을 사용하지 않는 것, 단지 구조체의 형태만 선언한 것.

struct tagBook

{

char title[50];

int price;

}


@구조체 정의

-정의 : 메모리 공간을 사용하는 것

struct tagBook BOOK;

더보기

@선언과 동시에 변수명 정의

struct tagBook

{

char title[50];

int price;

} BOOK, BOOK2, BOOK3;


-구조체를 선언과 동시에 변수를 정의하는 경우 태그명을 생략 할 수 있다

struct

{

char title[50];

int price

} BOOK, BOOK2, BOOK3;



@typedef


typedef unsigned short int UINT16;

->편리하게 unsigned short int를 UINT16으로 대체한다. 


@typedef sturct


typedef struct tagBook

{

char title[50];

int price;

} BOOK;


여기서 typedef를 뜯어 보자면 

typedef [타입] [별칭];

->typedef struct tagBookchar title[50]; int price; } BOOK;


구조체의 선언과 동시에 변수명 정의와 헷갈릴 수 있다. typedef를 사용하므로

BOOK은 변수명이 아닌 타입의 별칭(alias)가 된 것이다.

->즉, 쉽게, BOOK은 변수명이 아닌 타입이 된 것이다.(엄밀히 말하면 타입의 별칭, 타입처럼 사용하면됨) 

->tagBook은 생략가능하다


당연히 이렇게도 된다.

struct tagBook{

char title[50];

int price;

}

typedef struct tagBook BOOK;

->struct tagBook이 구조체를 정의하는 선언문, 즉 타입으로 보면된다.

차이점이라면 위에선 typedef를 사용하며 구조체선언을 동시에 한 것이고

지금은 선언과 typedef를 분리한 것이다.




@결론 


struct정의, 선언에서

typedef의 명시한 것과 안 한 것의

syntax차이가 없다.


struct tagBook

{

char title[50];

int price

} BOOK, BOOK2, BOOK3;

->tagBook 생략가능
->BOOK, BOOK2, BOOK3은 변수명

->세미콜론으로 끝난다



typedef struct tagBook

{

char title[50];

int price

} BOOK, BOOK2, BOOK3;

->tagBook생략가능

->BOOK, BOOK2, BOOK3은 타입이름

->struct tagBook book = BOOK book = BOOK2 book (참고로 C++에선 struct키워드 없이 tagBook book으로 선언 할 수 있다. 즉 typedef선언없이도 BOOK book같은 문장이 가능하다)

->세미콜론으로 끝난다


@태그이름 생략가능? 그럼에도 꼭 쓰는 코드를 몇 번 봤다. 왜그럴까?


펌>http://leanu.tistory.com/27

하지만, 진짜 언어 표준만을 지원하는 컴파일러는

위와 같은 구문은 컴파일시 에러나 워닝을 냅니다.

그래서 그와 같은 컴파일러에서는 구조체를 typedef로 새 타입이름으로 선언하더라도,

임시로 사용할 태그 이름이 필요하게 됩니다.

따라서, 이와 같은 컴파일러에서는 다음과 같이 임시 태그 이름을 사용하여

typedef로 타입 이름을 선언해야 합니다. 
(물론, 번거롭긴 하지만 표준과 일치하는 방법입니다.)

typedef struct _tagPoint{
     int x; 
     int y;
}POINT;

이와 같은 구문은, 어떤 컴파일러를 쓰더라도 정확히 동일한 결과를 내므로

안전한 기법이라고 할 수 있겠습니다.


반응형