typedef
typedef 선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것입니다.
예를 들면
typedef int INT
라고 선언을 하게 되면, 자료형의 이름 int에 INT라는 이름을 추가로 붙여줍니다.
결국엔
int num1;
INT num2;
동일한 자료형을 선언하게 됩니다.
typedef 선언에 있어서 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이뤄집니다.
즉 typedef name1 name2 name3라고 선언하면 name3가 'name1 name2'에 부여된 새로운 이름이 된 것입니다.
이때 name1, name2는 어떠한 의미가 있어야 합니다.(안 그러면 컴파일 에러가 발생함.)
당연한 거지만, typedef의 유효 범위 내에서만 사용이 가능합니다.
#include <stdio.h>
void F() {
typedef int INT;
INT N = 0;
}
int main(void) {
INT A = 0; //컴파일 에러
}
typedef과 구조체
typedef선언은 구조체도 가능합니다.
#include <stdio.h>
struct point
{
int xpos;
int ypos;
};
typedef struct point Point;
int main(void) {
Point pos;
}
구조체의 정의와 typedef의 선언을 한데 묶을 수도 있고, 또 이렇게 선언하는 것이 보다 일반적입니다.
#include <stdio.h>
typedef struct point
{
int xpos;
int ypos;
struct person * ptr;
} POINT; //이렇게 정의와 선언을 따로하는경우가 일반적이다.
struct person
{
int aa;
};
typedef struct person PERSON; //이렇게도 가능함
int main(void) {
}
위에 같은 예제입니다. 보통 위쪽 구조체 방식이 일반적입니다.
#include <stdio.h>
typedef struct
{
int xpos;
int ypos;
} POINT; //이렇게 정의와 선언을 따로하는경우가 일반적이다
int main(void) {
}
위에 예제는 typedef struct 동시에 선언해버리면 구조체 이름이 별 의미를 가지 않게 됩니다.
위와 같은 방법으로 선언하면 반드시 POINT로만 선언이 가능하며 struct Name 같은 방법으로는 불가능합니다.
typedef은 이름이 너무 길어지면 간단하게 줄일 수 있으니 유용하게 사용되는 편입니다.
댓글