C++
Typedef 및 유형 별칭
수색…
소개
키워드 를 using
하는 typedef
와 (C ++ 11 이후) 기존 유형에 새로운 이름을 부여하는 데 사용할 수 있습니다.
통사론
- typedef 타입 지정자 seq init-declarator-list ;
- 속성 지정자 seq typedef 선언자 지정자 seq init-declarator-list ; // C ++ 11 이후
- 식별자를 사용하여 속성 지정자 - seq ( opt ) = type-id ; // C ++ 11 이후
기본 typedef 구문
typedef
선언은 변수 또는 함수 선언과 동일한 구문을 갖지만 typedef
라는 단어를 포함합니다. typedef
있으면 선언을 통해 변수 나 함수 대신 유형을 선언합니다.
int T; // T has type int
typedef int T; // T is an alias for int
int A[100]; // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"
유형 별명이 정의되면 유형의 원래 이름과 같은 의미로 사용할 수 있습니다.
typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
A data;
};
typedef
는 구별 유형을 작성하지 않습니다. 기존 유형을 참조하는 다른 방법을 제공합니다.
struct S {
int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }
typedef의보다 복잡한 사용
typedef
선언은 일반적인 변수 및 함수 선언과 동일한 구문을 사용하여 더 복잡한 선언을 읽고 쓸 수 있습니다.
void (*f)(int); // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"
이는 비 정적 멤버에 대한 포인터와 같이 혼동하는 구문을 사용하는 구문에 특히 유용합니다.
void (Foo::*pmf)(int); // pmf has type "pointer to member function of Foo taking int
// and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
// taking int and returning void"
숙련 된 프로그래머라도 다음 함수 선언의 구문을 기억하기는 어렵습니다.
void (Foo::*Foo::f(const char*))(int);
int (&g())[100];
typedef
를 사용하여 읽기 쉽고 쓸 수 있습니다.
typedef void (Foo::pmf)(int); // pmf is a pointer to member function type
pmf Foo::f(const char*); // f is a member function of Foo
typedef int (&ra)[100]; // ra means "reference to array of 100 ints"
ra g(); // g returns reference to array of 100 ints
typedef로 여러 유형 선언
typedef
키워드는 지정자이므로 각 선언자에 개별적으로 적용됩니다. 따라서 선언 된 각 이름은 typedef
가 없을 때 그 이름이 가질 유형을 참조합니다.
int *x, (*p)(); // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()
"using"을 사용한 별칭 선언
구문의 using
정의 할 수있는 이름 왼편에 진행하고, 정의는 오른쪽 간다 : 매우 간단하다. 이름이 어디인지를 검사 할 필요가 없습니다.
using I = int;
using A = int[100]; // array of 100 ints
using FP = void(*)(int); // pointer to function of int returning void
using MP = void (Foo::*)(int); // pointer to member function of Foo of int returning void
using
을 using
유형 별명을 작성하는 것은 typedef
로 유형 별명을 작성하는 것과 완전히 동일한 효과 using
갖습니다. 같은 것을 달성하기위한 대체 구문 일뿐입니다.
typedef
와는 달리, using
을 템플릿화할 수 있습니다. using
을 using
작성된 "템플리트 typedef"를 별명 템플리트 라고합니다.