검색결과 리스트
글
C에서 새로운 데이터형의 이름을 만드는 typedef라는 것이 있다. 예를 들어 다음과 같이 선언하면
typedef int Length;
int와 동의어로 Length라는 이름을 만든다 Length형은 int 라는 형태와 똑같이 선언이나 캐스트(cast)등에 사용될수 있다.
Length len,maxlen;
Length *lengths[];
또 다음과 같이 선언하면
typedef char *String;
String은 char *,즉 문자 포인터와 동의어가 되어서 다음과 같은 선언에도 사용할수 있다.
String p, lineptr[MAXLINES], alloc(int);
int strcmp(String, String);
p = (String) malloc(100);
typedef 선언문의 형태는 extern이나 static 선언문의 형태와 같다 여기서느 이름을 강조하기 위해 첫 글자인 S를 대문자로 썻다
좀더 복잡한 예를 보면 typedef는 이 장의 처음에서 보았던 트리의 마디(tree node)에 사용 될수 있다.
typedef struct tnode *Treeptr;
typedef struct tnode { /* the tree node: */
char *word; /* points to the text */
int count; /* number of occurrences */
struct tnode *left;/* left child */
struct tnode *right/* right child */
} Treenode;
이렇게 하면 Treenode(구조체)와 Treeptr(구조체에 대한 포인터)라는 새로운 형의 두개의 키워드가 만들어 진다. 이렇게 한 후에는 talloc는 다음과 같이 고쳐진다.
Treeptr talloc(void)
{
return (Treeptr) malloc(sizeof(Treenode));
}
그러나 typedef 선언이 새로운 형을 만드는 것이 아니라 이미 있는 형에 새로운 이름을 붙인 것에 지나지 않는다은 사실을 알아야 한다. 뿐만 아니라 어떤 새로운 의미도 없다. 이렇게 선언된 변수는 선언문을 사용해서 선언한 변수와 똑같은 성질을 갖는다. 결국 typedef는 컴파일러에게 주는 명령 이란느 점과 C매크로 프로세서는 할수 없는 텍스트 교환에 사용될수 있다는 점을 제외하고 #define과 같다 예를 들어
typedef int (*PFI) (char *,char *);
이렇게 하면 PFI라는 형이 만들어지는데 PFI는 두개의 char *인자를 받아 int 를 리턴하는 함수의 포인터이다.
PFI strcmp,numcmp;
이는 제 5장의 정렬(sort)프로그램에서 사용하였다
순수하게 미적인 용도 외에도 typedef 선언을 사용하는 두가지 이유가 있다. 첫 번쨰는 호환성의 문제이다. 만약에 typedef 가 기종에 따라 다른 데이터형에 사용될 경우 프로그램이 옮겨질 때 typedef 만 바꾸면 되는 것이다. 즉 typedef 을 각 호스트머신에 따라 short,int,long 중 알맞는 것을 골라 쓸수 있다는 것이다 표준 라이브러리에서 size_t와 ptrdiff_t 와 같은 형이 그 예잉다 typedef 를 쓰는 두번째 목적은 프로그램을 보기 쉽게 하기 위해서이다 Treeptr이라 불리틑 형은 복잡한 구조체에 대한 포인터로만 선언된 형보다 이해하기가 훨씬 쉽다.
'프로그래밍 > C' 카테고리의 다른 글
6.9 비트 필드(Bit-fields) (0) | 2014.11.08 |
---|---|
6.8 유니온(Unions) (0) | 2014.11.08 |
6.6 테이블 조사(Table Lookup) (0) | 2014.11.08 |
6.5 자기참조 구조체(Self-referential Structures) (0) | 2014.11.08 |
6.4 구조체에 대한 포인터(Pointers to Structures) (0) | 2014.11.06 |
RECENT COMMENT