[C++] typedef

출처 - http://www.benjaminlog.com/entry/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);

댓글

이 블로그의 인기 게시물

[NSIS] 32비트와 64비트 모듈 등록하는 법. (regsvr32)

[Visual Studio] Windows 7 에서 Visual Studio 6.0 디버그 시 프로세스 좀비되는 증상 해결 방법