C++/Study

[C++] typedef

MoongStory 2024. 12. 15. 00:19
반응형

출처 - 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);
반응형

'C++ > Study' 카테고리의 다른 글

[C] 변수의 이름을 짓는 규칙 (변수명 규칙)  (0) 2024.12.16
[C++] 연산자 우선순위  (0) 2024.12.15
[C++] 새로운 자료형 bool  (0) 2024.12.15
[C++] const 참조자의 상수 참조  (0) 2024.12.14
[C++] 파일 분할 기준  (0) 2024.12.14