[C++] typedef
출처 - http://www.benjaminlog.com/entry/typedef
typedef BOOL int;
typedef int BOOL;
BOOL flag로 선언하면 int flag와 동일한 문장이 되게 하려면 둘 중 어느것으로 선언해야하나...
답은 아래 typedef int BOOL; 이 맞다.
이어서 다른 typedef 정의들을 보자면
typedef를 정의할 때는 이를 헷갈리지 않기 위해 딱 한 가지만 기억하면 된다.
"변수를 적어야 할 위치에 새로운 타입을 적어라."
위에 나왔던 typedef 들을 다시 하나씩 살펴보면...
(빨강색은 타입, 파란색은 변수)
이제 typedef를 다시 보면
이렇듯 변수명을 적어줄 위치에 대체할 타입명을 적어주면 이 타입명으로 대체가 가능하다.
구조체도 마찬가지로
이렇게 선언하면 _student 구조체를 정의함과 동시에 student라는 변수명으로 구조체가 생성이된다.
위에 int j, *p; 이렇게 선언한 것처럼
이렇게도 선언이 가능한데...
"변수를 적어야 할 위치에 새로운 타입을 적어라" 이 말을 명심하며 typedef를 해보면
이런식으로 typedef를 할 수 있다.
그럼 아래와 같이 된다.
student st; == struct _student st;
pStudent pSt; == struct _student *pSt;
ppStudent ppSt == struct _student **ppSt;
이어서 함수 포인터 typedef를 보면
void (*foo)(int i, int *p); 이 함수 포인터의 타입과 변수명은 아래와 같다.
위와 같이 함수 포인터의 경우에는 변수명이 함수의 반환타입과 매개변수의 사이에 들어가게 된다.
사용 예를 보자면
이를 typedef를 사용해서 다시 코딩해보면
함수에 호출 규약까지 넣는 경우에는 아래처럼 괄호 안에 반드시 호출규약을 넣어 주어야 한다.
typedef BOOL int;
typedef int BOOL;
BOOL flag로 선언하면 int flag와 동일한 문장이 되게 하려면 둘 중 어느것으로 선언해야하나...
답은 아래 typedef int BOOL; 이 맞다.
이어서 다른 typedef 정의들을 보자면
typedef int BOOL, *PBOOL;
typedef struct _student{
int stNo;
int korScore;
}student, *pstudent;
typedef void (*pFunc)(int, int*);
위 3개의 typedef 정의를 보면 어디까지가 정의이고 어디가 그걸 대체하는 type인지 헷갈리기 시작한다.typedef를 정의할 때는 이를 헷갈리지 않기 위해 딱 한 가지만 기억하면 된다.
"변수를 적어야 할 위치에 새로운 타입을 적어라."
위에 나왔던 typedef 들을 다시 하나씩 살펴보면...
(빨강색은 타입, 파란색은 변수)
int i;
int j, *p;
이제 typedef를 다시 보면
typedef int BOOL;
typedef int BOOL, *PBOOL;
이렇듯 변수명을 적어줄 위치에 대체할 타입명을 적어주면 이 타입명으로 대체가 가능하다.
구조체도 마찬가지로
struct _student{
int stNo;
int korScore;
}student;
이렇게 선언하면 _student 구조체를 정의함과 동시에 student라는 변수명으로 구조체가 생성이된다.
위에 int j, *p; 이렇게 선언한 것처럼
struct _student{
int stNo;
int korScore;
}st, *pSt, **ppSt;
이렇게도 선언이 가능한데...
"변수를 적어야 할 위치에 새로운 타입을 적어라" 이 말을 명심하며 typedef를 해보면
typedef struct _student{
int stNo;
int korScore;
}student, *pStudent, **ppStudent;
이런식으로 typedef를 할 수 있다.
그럼 아래와 같이 된다.
student st; == struct _student st;
pStudent pSt; == struct _student *pSt;
ppStudent ppSt == struct _student **ppSt;
이어서 함수 포인터 typedef를 보면
void (*foo)(int i, int *p); 이 함수 포인터의 타입과 변수명은 아래와 같다.
void (*foo)(int, int*)
위와 같이 함수 포인터의 경우에는 변수명이 함수의 반환타입과 매개변수의 사이에 들어가게 된다.
사용 예를 보자면
void prn(int num)
{
printf("%d", num);
}
int main()
{
void (*pFunc)(int) = prn; // pFuncvoid(*)(int) 타입의 변수 pFunc을 선언함과 동시에 prn 함수의 주소값으로 초기화한다.
pFunc(10); // prn(10); == pFunc(10);, 함수 포인터로 호출도 가능하고 출력 결과는 동일하게 나온다.
}
이를 typedef를 사용해서 다시 코딩해보면
typedef void (*pFunction)(int);
void prn(int num)
{
printf("%d", num);
}
int main()
{
// void(*)(int) 타입을 대체하는 새로 정의된 자료형 pFunction으로 void(*)(int)형 변수
// pFunc를 선언함과 동시에 prn 함수의 주소값으로 초기화한다.
pFunction pFunc = prn;
pFunc(10); // prn(10); == pFunc(10);, 함수 포인터로 호출도 가능하고 출력 결과는 동일하게 나온다.
}
함수에 호출 규약까지 넣는 경우에는 아래처럼 괄호 안에 반드시 호출규약을 넣어 주어야 한다.
typedef void (__stdcall *pFunction)(int);
댓글
댓글 쓰기