Typedef declaration
typedef 선언 은 식별자를 타입 별칭으로 선언하는 방법을 제공하며, 복잡할 수 있는 타입 이름 을 대체하기 위해 사용됩니다.
키워드 typedef 는 선언 에서 사용되며, 저장 클래스 지정자 의 문법적 위치에 있지만, 저장 기간이나 링크에는 영향을 주지 않습니다:
typedef int int_t; // int_t를 int 타입의 별칭으로 선언 typedef char char_t, *char_p, (*fp)(void); // char_t를 char의 별칭으로 선언 // char_p를 char*의 별칭으로 선언 // fp를 char(*)(void)의 별칭으로 선언
목차 |
설명
만약 선언 이 typedef 를 저장 클래스 지정자로 사용한다면, 그 안의 모든 선언자는 지정된 타입에 대한 별칭으로 식별자를 정의합니다. 선언에서 하나의 저장 클래스 지정자만 허용되므로, typedef 선언은 static이나 extern 일 수 없습니다.
typedef 선언은 별개의 타입을 도입하지 않으며, 기존 타입에 대한 동의어만을 설정합니다. 따라서 typedef 이름은 그것들이 별칭으로 지정하는 타입과 호환됩니다 . typedef 이름은 열거자, 변수, 함수와 같은 일반 식별자와 동일한 이름 공간 을 공유합니다.
|
VLA에 대한 typedef는 블록 범위에서만 나타날 수 있습니다. 배열 자체의 선언과 달리, 배열의 길이는 제어 흐름이 typedef 선언을 통과할 때마다 평가됩니다: void copyt(int n) { typedef int B[n]; // B is a VLA, its size is n, evaluated now n += 1; B a; // size of a is n from before +=1 int b[n]; // a and b are different sizes for (int i = 1; i < n; i++) a[i-1] = b[i]; } |
(C99부터) |
참고 사항
typedef 이름은 불완전한 타입 일 수 있으며, 일반적인 방식으로 완성될 수 있습니다:
typedef int A[]; // A는 int[] 타입입니다 A a = {1, 2}, b = {3,4,5}; // a의 타입은 int[2], b의 타입은 int[3]입니다
typedef 선언은 종종 태그 name space 에서 일반 name space로 이름을 주입하는 데 사용됩니다:
typedef struct tnode tnode; // 일반 이름 공간에서 tnode는 // 태그 이름 공간의 tnode에 대한 별칭입니다 struct tnode { int count; tnode *left, *right; // struct tnode *left, *right;와 동일합니다 }; // 이제 tnode는 완전한 타입입니다 tnode s, *sp; // struct tnode s, *sp;와 동일합니다
심지어 태그 네임스페이스를 전혀 사용하지 않을 수도 있습니다:
typedef struct { double hi, lo; } range; range z, *zp;
typedef 이름은 또한 복잡한 선언의 구문을 단순화하기 위해 흔히 사용됩니다:
// 3개의 int를 가진 배열에 대한 포인터를 반환하는 함수에 대한 5개의 포인터 배열 int (*(*callbacks[5])(void))[3]; // typedef를 사용한 동일한 선언 typedef int arr_t[3]; // arr_t는 3개의 int 배열 typedef arr_t* (*fp)(void); // arr_t*를 반환하는 함수에 대한 포인터 fp callbacks[5];
라이브러리는 종종 시스템 종속적이거나 구성 종속적인 타입들을 typedef 이름으로 노출하여, 사용자나 다른 라이브러리 구성 요소에 일관된 인터페이스를 제공합니다:
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 6.7.8 형식 정의 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
-
- 6.7.8 형식 정의 (p: TBD)
- C11 표준 (ISO/IEC 9899:2011):
-
- 6.7.8 형식 정의 (p: 137-138)
- C99 표준 (ISO/IEC 9899:1999):
-
- 6.7.7 유형 정의 (p: 123-124)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 3.5.6 형식 정의
키워드
참고 항목
|
C++ 문서
참조:
typedef
선언
|