Namespaces
Variants

Typedef declaration

From cppreference.net

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 형식 정의

키워드

typedef

참고 항목

C++ 문서 참조: typedef 선언