C/C++에서 typedef 에 대한 정의 와 용법 요약

C 또는 C++코드 에 서 는 type:def 를 많이 사용 합 니 다.C 코드 에 서 는 특히 많 습 니 다.typedef 는\#define 과 약간 비슷 하지만 사실은 다르다.특히 복잡 한 용법 에서 인터넷 에서 C/C++학습자 의 블 로 그 를 보 았 는데 그 중에서 typedef 에 관 한 정 리 는 좋 았 다.정 리 를 잘 했 기 때문에 나 는 수정 하지 않 고 인용 하여 자신의 분석 을 더 했다.기본 정의:typedef 는 C 언어의 키워드 로 데이터 형식 에 대한 새로운 이름 을 정의 하 는 역할 을 합 니 다.이곳 의 데이터 형식 은 내부 데이터 형식(int,char 등)과 사용자 정의 데이터 형식(struct 등)을 포함한다.프로 그래 밍 에서 type:def 를 사용 하 는 목적 은 보통 두 가지 가 있 습 니 다.하 나 는 변수 에 기억 하기 쉽 고 의미 가 명확 한 새로운 이름 을 주 는 것 이 고 다른 하 나 는 비교적 복잡 한 유형 성명 을 간소화 하 는 것 입 니 다.용도 1:\#define 과 의 차이 typedef 행 위 는\#define 매크로 와 같 습 니 다.동의 자 를 실제 유형 으로 대체 합 니 다.다른 점 은 type:def 가 컴 파일 할 때 해석 되 기 때문에 컴 파일 러 가 예비 프로세서 의 능력 을 뛰 어 넘 는 텍스트 교체 에 대처 하도록 합 니 다.용도 2:단순 한 매크로 교체 가 아 닌 잘못된 정의 의 별명 을 줄 입 니 다.포인터 형 을 동시에 설명 하 는 여러 대상 으로 사용 할 수 있다.예 를 들 어
 
char* pa, pb; // , ,
// ;
다음은 가능 하 다.
 
typedef char* PCHAR;
PCHAR pa, pb;
이런 용법 은 매우 유용 하 다.특히 char*pa,pb 의 정 의 는 초보 자 들 은 두 개의 문자 형 지침 을 정의 했다 고 생각 하 는데 사실은 그렇지 않다.typedef char*PCHAR 로 이런 문제 가 발생 하지 않 고 오류 의 발생 을 줄 였 다.용도 3:직관 적 이 고 간결 하 게 오래된 C 코드 에 사용 하여 struct 를 돕는다.이전 코드 에서 struct 의 새로운 대상 을 설명 할 때 struct 를 가 져 가 야 합 니 다.즉,형식 은 struct 구조 명 대상 이름 입 니 다.예 를 들 어
 
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
이 고 C++에 서 는 구조 명 대상 이름,즉 tagPOINT 1 p1 이 라 고 직접 쓸 수 있 습 니 다.
 
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 이렇게 하면 원래 의 방식 보다 struct 를 적 게 쓰 고 비교적 편리 하 다.특히 대량으로 사용 할 때 C++에서 type:def 의 이런 용 도 는 그리 크 지 않 지만 이 를 이해 하면 예전 의 오래된 코드 를 파악 하 는 데 도움 이 될 것 이다.왜냐하면 우 리 는 프로젝트 에서 비교적 일찍 남 겨 진 코드 를 만 날 수 있 기 때문이다.용도 4:플랫폼 의 무관 성 은 type:def 로 플랫폼 과 무관 한 유형 을 정의 합 니 다.typedef 는 또 다른 중요 한 용도 가 있 습 니 다.그것 은 바로 기계 와 무관 한 유형 을 정의 하 는 것 입 니 다.예 를 들 어 REAL 이라는 부동 소수점 유형 을 정의 할 수 있 습 니 다.목표 기계 에서 가장 높 은 정 도 를 얻 을 수 있 습 니 다.
 
typedef long double REAL;
롱 double 을 지원 하지 않 는 기계 에서 이 typedef 는 다음 과 같 습 니 다.
 
typedef double REAL;
그리고 double 도 지원 하지 않 는 기계 에서...이 type:def 는 이렇게 보일 것 같 습 니 다.
 
typedef float REAL;
즉,플랫폼 을 뛰 어 넘 을 때 type:def 자 체 를 고치 면 됩 니 다.다른 소스 코드 를 수정 하지 않 아 도 됩 니 다.표준 라 이브 러 리 는 이 기술 을 광범 위 하 게 사용 했다.예 를 들 어 sizet。또한,typedef 는 하나의 유형의 새로운 별명 을 정의 하기 때문에 간단 한 문자열 교체 가 아니 기 때문에 매크로 보다 안정 적 입 니 다.용도 5:복합 유형 type:def 를 숨 기 고 포인터 와 배열 등 복합 유형 도 숨 길 수 있 습 니 다.예 를 들 어 81 개의 문자 요소 가 있 는 배열 을 아래 와 같이 반복 적 으로 정의 하지 않 아 도 됩 니 다.
 
char line[81];
  char text[81];
type def 를 정의 합 니 다.같은 유형 과 크기 의 배열 을 사용 할 때마다 이렇게 할 수 있 습 니 다.
 
typedef char Line[81];
이때 Line 유형 은 81 개의 요 소 를 가 진 문자 배열 을 대표 합 니 다.사용 방법 은 다음 과 같 습 니 다.
 
Line text, secondline;
  getline(text);
마찬가지 입 니 다.아래 와 같이 지침 문법 을 숨 길 수 있 습 니 다.
 
typedef char * pstr;
  int mystrcmp(pstr, pstr);
여기 서 우 리 를 첫 번 째 typedef 함정 에 도착 시 킬 것 입 니 다.표준 함수 strcmp()에는 두 개의'const char*'유형의 인자 가 있 습 니 다.따라서 mystrcmp():
 
int mystrcmp(const pstr, const pstr);
GNU 의 gcc 와 g++컴 파 일 러 를 사용 하면 경고 가 나타 날 수 있 습 니 다.순서대로'const pstr'는'char*const'(char 를 가리 키 는 지침 상수)로 해 석 됩 니 다.둘 은 같은 뜻 이 아 닙 니 다.정확 한 유형 을 얻 기 위해 서 는 다음 과 같은 성명 을 해 야 한다.
 
typedef const char* pstr;
용도 6:코드 간소화 코드 간소화.복잡 한 성명 을 위해 새로운 간단 한 별명 을 정의 합 니 다.방법 은 원래 의 성명 에서 일부 복잡 한 성명 을 점차적으로 별명 으로 교체 하 는 것 이다.이렇게 순환 하면 변수 이름 이 있 는 부분 을 마지막 으로 교체 하고 원래 성명 의 가장 간단 한 버 전 을 얻 을 수 있다.예:원래 성명:
 
void (*b[10]) (void (*)());
변 수 는 b 이 고 오른쪽 괄호 안에 있 는 것 을 먼저 교체 합 니 다.pFunParam 은 별명
 
typedef void (*pFunParam)();
으로 왼쪽 변 수 를 교체 합 니 다.b,pFunx 는 별명 2 입 니 다.
 
typedef void (*pFunx)(pFunParam);
원래 성명 의 가장 간략화 판:
 
pFunx b[10];
원래 성명:
 
doube(*)() (*e)[9];
변 수 는 e 이 고 왼쪽 부분 을 먼저 교체 합 니 다.pFuny 는 별명 1 입 니 다.
 
typedef double(*pFuny)();
오른쪽 변 수 를 교체 합 니 다.pfonParamy 는 별명 2
 
typedef pFuny (*pFunParamy)[9];
원 성명 의 가장 간단 한 버 전 입 니 다.
 
pFunParamy e;
복잡 한 성명 에 사용 할 수 있 는'오른쪽 왼쪽 법칙'을 이해 합 니 다.변수 이름 으로 볼 때 먼저 오른쪽,다시 왼쪽으로 괄호 를 만 나 읽 는 방향 으로 바 꿉 니 다.괄호 안에 분석 이 끝나 면 괄호 를 벗 어 나 든 지,아니면 오른쪽,왼쪽 순 으로 전체 성명 분석 이 끝 날 때 까지 순환 합 니까?예 를 들 어
 
int (*func)(int *p);
먼저 변수 이름 func 를 찾 았 습 니 다.밖 에 괄호 가 있 고 왼쪽 은*번 입 니 다.이것 은 func 가 지침 이라는 것 을 설명 합 니 다.그 다음 에 이 괄호 에서 뛰 어 내 려 오른쪽 을 먼저 보고 괄호 를 만 났 습 니 다.이것 은(*func)이 함수 이기 때문에 func 는 이런 함 수 를 가리 키 는 지침 입 니 다.즉,함수 지침 입 니 다.이런 함 수 는 int*유형의 형 삼 을 가지 고 반환 값 유형 은 int 입 니 다.
 
int (*func[5])(int *);
func 오른쪽 은[]연산 자 이 고 func 는 5 개의 요 소 를 가 진 배열 임 을 나타 낸다.func 의 왼쪽 에 하나의*가 있 는데 이것 은 func 의 요소 가 지침 이라는 것 을 설명 합 니 다.(여기 있 는*는 func 를 수식 하 는 것 이 아니 라 func[5]를 수식 하 는 것 입 니 다.이 유 는[]연산 자 우선 순위 가*보다 높 고 func 가 먼저[]와 결합 하기 때 문 입 니 다.)이 괄호 를 뛰 어 내 려 오른쪽 을 보고 원 괄호 를 만 났 습 니 다.func 배열 의 요 소 는 함수 형식의 지침 임 을 설명 합 니 다.가리 키 는 함 수 는 int*형식의 형 삼 을 가지 고 있 으 며 반환 값 유형 은 int 입 니 다.용도 7:type:def 와 저장 소 키워드(storage class specifier)라 는 말 은 좀 놀 랍 지 않 습 니까?type:def 는 auto,extern,mutable,static,register 와 같이 저장 소 키워드 입 니 다.이것 은 type:def 가 대상 의 저장 특성 에 진정 으로 영향 을 줄 수 있다 는 것 이 아니다.이것 은 단지 문장 구성 에 있어 typedef 성명 이 static,extern 등 유형의 변수 성명 처럼 보인다 고 말 할 뿐이다.다음은 두 번 째 함정 으로 가 져 갈 것 입 니 다.
 
typedef register int FAST_COUNTER; //
컴 파일 이 통 하지 않 습 니 다.문 제 는 성명 에 여러 개의 메모리 키 워드 를 저장 할 수 없다 는 것 이다.기호 typedef 는 저장 소 키워드 의 위 치 를 차지 하기 때문에 typedef 성명 에서 register(또는 다른 저장 소 키워드)를 사용 할 수 없습니다.

좋은 웹페이지 즐겨찾기