Namespaces
Variants

typedef specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
  • 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
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 선언