typedef 선언
typedef 선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것을 목적으로 하는 선언이다.
#include<stdio.h>
typedef int INT;
typedef int* PTR_INT;
typedef unsigned int UINT;
typedef unsigned int* PTR_UINT;
typedef unsigned char UCHAR;
typedef unsigned char* PTR_UCHAR;
int main(void)
{
INT num1 = 120;
PTR_INT pnum1 = &num1;
UINT num2 = 190;
PTR_UINT pnum2 = &num2;
UCHAR ch = 'z';
PTR_UCHAR pch = &ch;
printf("%d, %u, %c \n", *pnum1, *pnum2, *pch);
return 0;
}
typedef int INT; int의 또 다른 이름 INT를 부여한 문장이다.(자료형의 이름 int에 INT라는 이름을 추가로 붙여준 것이다.)
그러므로 int num; 과 INT num; 은 동일한 선언이다. 또 int * ptr; 과 INT * ptr; 은 동일한 선언이다.
typedef unsigned int* PTR_UINT; unsigned int*의 포인터형에 PTR_UINT의 이름이 새롭게 부여되었다.
PTR_UINT pnum2 = &num2; 의 문장은 unsigned int * pnum2 = &num2; 와 동일하다.
typedef 선언에 있어 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이루어진다고 한다.
예를 들면 typedef name1 name2 name3; 의 형태로 선언이 되었다면, 가장 마지막에 등장한 name3가 'name1 name2'에 부여된 새로운 이름이 되는 것이다.
참고로, typedef로 정의되는 자료형의 이름은 대문자로 시작하는 것이 관례라고 한다.
Ex) typedef unsigned char* PTR_UCHAR;
구조체의 정의와 typedef선언
<예시>
#include<stdio.h>
struct point
{
int xpos;
int ypos;
};
typedef struct point Point;
typedef struct person
{
char name[20];
char phoneNum[20];
int age;
}Person;
int main(void)
{
Point pos = { 10,20 };
Person man = { "이승","010-0000-0000",21 };
printf("%d %d\n", pos.xpos, pos.ypos);
printf("%s %s %d\n", man.name, man.phoneNum, man.age);
return 0;
}
typedef struct point Point ; struct point에 Point라는 이름을 부여한 것이다.
즉, stucrt point를 대신할 수 있도록, Point를 정의했으니 , struct 선언을 생략한 형태로 구조체 변수를 선언할 수 있다.
Point pos; (typedef 선언을 이용한 변수의 선언)
만약, typedef 선언을 이용하지 않은 채로 구조체 변수를 선언한다면, struct point pos;와 같이 struct 선언을 추가한 형태의 변수 선언을 해주어야 한다.
<구조체 이름 생략>
typedef struct
{
char name[20];
char phoneNum[20];
int age;
}Person;
위 예시에서 typedef선언을 이용해 Person이라는 이름을 새롭게 부여했었는데, 이렇게 새롭게 이름이 부여가 되면 그전 구조체의 이름 person은 사실상 별 의미를 갖지 않으므로 위와 같이 구조체 이름을 생략하는 것이 가능하다.