typedef
specifier
-
-
typedef- (복잡할 수 있는) 타입 이름 대신 사용할 수 있는 별칭을 생성합니다.
-
목차 |
설명
typedef 지정자는 선언 에서 사용될 때, 해당 선언이 변수나 함수 선언이 아닌 typedef 선언 임을 지정합니다.
일반적으로 typedef 지정자는 선언의 시작 부분에 나타나지만, 타입 지정자 뒤 또는 두 타입 지정자 사이에 나타나는 것도 허용됩니다. typedef 지정자는 타입 지정자를 제외한 다른 지정자와 결합할 수 없습니다.
typedef 선언은 동일한 줄에 하나 이상의 식별자를 선언할 수 있습니다(예: int 및 int 에 대한 포인터). 배열 및 함수 타입, 포인터와 참조, 클래스 타입 등을 선언할 수 있습니다. 이 선언에서 도입된 모든 식별자는 typedef 이름 이 되며, 이는 typedef 키워드가 제거되었을 때 해당 식별자가 갖게 될 객체나 함수의 타입과 동의어입니다.
typedef 이름은 기존 타입에 대한 별칭이며, 새로운 타입의 선언이 아닙니다. typedef 는 기존 타입 이름(typedef 이름 포함)의 의미를 변경하는 데 사용할 수 없습니다. 한번 선언된 typedef 이름은 동일한 타입을 다시 참조하도록만 재선언될 수 있습니다. typedef 이름은 해당 이름이 보이는 범위에서만 유효합니다: 서로 다른 함수나 클래스 선언에서 동일한 이름을 가진 타입을 서로 다른 의미로 정의할 수 있습니다.
typedef 지정자는 함수 매개변수의 선언에 나타날 수 없으며 함수 정의 의 decl-specifier-seq 에도 나타날 수 없습니다:
void f1(typedef int param); // 잘못된 형식 typedef int f2() {} // 잘못된 형식
typedef 지정자는 선언자(declarator)를 포함하지 않는 선언에서 나타날 수 없습니다:
typedef struct X {}; // 잘못된 형식
링크 목적을 위한 typedef 이름
typedef 선언이 이름 없는 클래스 또는 열거형 을 정의하는 경우, 해당 선언에 의해 선언된 클래스 타입 또는 열거형 타입의 첫 번째 typedef 이름은 해당 타입의 linkage 목적을 위한 typedef 이름 입니다.
예를 들어,
typedef
struct
{
/* ... */
}
S
;
에서,
S
는 링크 목적을 위한 typedef 이름입니다. 이 방식으로 정의된 클래스나 열거형 타입은
외부 링크
를 가집니다 (이름 없는 네임스페이스에 있는 경우를 제외하고).
|
이러한 방식으로 정의된 무명 클래스는 C 호환 구조체만 포함해야 합니다. 특히, 다음과 같은 것을 해서는 안 됩니다.
그리고 모든 멤버 클래스도 (재귀적으로) 이러한 요구사항을 충족해야 합니다. |
(since C++20) |
참고 사항
|
타입 별칭 은 typedef 선언과 동일한 기능을 다른 구문으로 제공하며, 템플릿 이름에도 적용 가능합니다. |
(since C++11) |
키워드
예제
// 간단한 typedef typedef unsigned long ulong; // 다음 두 객체는 동일한 타입을 가짐 unsigned long l1; ulong l2; // 더 복잡한 typedef typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10]; // 다음 두 객체는 동일한 타입을 가짐 int a1[10]; arr_t a2; // 주의: 다음 두 객체는 동일한 타입을 가지지 않음 const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // "struct S"를 작성하지 않아도 되는 일반적인 C 관용구 typedef struct { int a; int b; } S, *pS; // 다음 두 객체는 동일한 타입을 가짐 pS ps1; S* ps2; // 오류: 저장 클래스 지정자는 typedef 선언에 나타날 수 없음 // typedef static unsigned int uint; // typedef는 선언 지정자 시퀀스의 어디에서나 사용 가능 long unsigned typedef int long ullong; // 더 일반적으로 "typedef unsigned long long int ullong;"으로 표기 // std::add_const는 다른 많은 메타함수들과 마찬가지로 멤버 typedef 사용 template<class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // listNode라는 새로운 (불완전) 구조체 타입 선언 } listNode; // 오류: 이전에 선언된 구조체 이름과 충돌 // C++20 오류: "연결을 위한 typedef 이름을 가진 구조체"가 멤버 함수를 가짐 typedef struct { void f() {} } C_Incompatible;
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 576 | C++98 | typedef 는 전체 함수 정의에서 허용되지 않았음 | 함수 본문에서 허용됨 |
| CWG 2071 | C++98 | typedef 이 선언자를 포함하지 않는 선언에 나타날 수 있었음 | 현재 허용되지 않음 |
참고 항목
|
C 문서
에 대한
Typedef 선언
|