출처 - 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 |