Typedef 선언

typedef 선언은 typedef를 스토리지 클래스로 사용하는 선언입니다. 선언자는 새 형식이 됩니다. typedef 선언을 사용하여 C에서 이미 정의된 형식이나 사용자가 선언한 형식에 대한 보다 짧거나 의미 있는 이름을 생성할 수 있습니다. typedef 이름을 사용하면 변경될 수 있는 구현 정보를 캡슐화할 수 있습니다.

typedef 선언은 변수 또는 함수 선언과 같은 방식으로 해석되지만, 선언에 형식이 지정되었다고 가정하는 대신 식별자가 형식의 동의어가 됩니다.

구문

declaration:
declaration-specifiersinit-declarator-listopt;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersopt
type-specifierdeclaration-specifiersopt
type-qualifierdeclaration-specifiersopt

storage-class-specifier:
typedef

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name

typedef-name:
identifier

typedef 선언은 새 형식을 만들지 않습니다. 기존 형식의 동의어나 다른 방식으로 지정할 수 있는 형식의 이름을 만듭니다. typedef 이름을 형식 지정자로 사용하는 경우 특정 형식 지정자와 함께 사용할 수 있습니다. 허용되는 한정자에는 constvolatile 이 포함됩니다.

Typedef 이름은 일반 식별자와 이름 공간을 공유합니다. (자세한 내용은 이름 공간을 참조하세요.) 따라서 프로그램에 동일한 이름의 typedef 이름과 로컬 범위 식별자가 있을 수 있습니다. 예:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

typedef와 동일한 이름의 로컬 범위 식별자를 선언하거나 같은 범위 또는 내부 범위에서 구조체 또는 공용 구조체의 멤버를 선언할 때 반드시 형식 지정자를 지정해야 합니다. 이 예제에서는 이 제약 조건을 보여 줍니다.

typedef char FlagType;
const FlagType x;

식별자, 구조체 멤버 또는 공용 구조체 멤버에 FlagType 이름을 다시 사용하려면 형식을 제공해야 합니다.

const int FlagType;  /* Type specifier required */

말하는 것으로 충분하지 않은 이유는

const FlagType;      /* Incomplete specification */

FlagType이 다시 선언되는 식별자가 아니라 형식의 일부로 간주되기 때문입니다. 이 선언은 다음과 같이 잘못된 선언으로 간주됩니다.

int;  /* Illegal declaration */

포인터, 함수 및 배열 형식을 비롯한 모든 형식을 typedef를 사용하여 선언할 수 있습니다. 정의의 표시 유형이 선언의 표시 유형과 동일한 경우 구조체 또는 공용 구조체 형식을 정의하기 전에 구조체 또는 공용 구조체 형식에 대한 포인터의 typedef 이름을 선언할 수 있습니다.

typedef 이름을 사용하면 코드 가독성을 높일 수 있습니다. signal의 다음 세 가지 선언 모두 정확히 같은 형식을 지정하며, 첫 번째는 typedef 이름을 사용하지 않습니다.

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */

void ( *signal( int, void (*) (int)) ) ( int );
fv *signal( int, fv * );   /* Uses typedef type */
pfv signal( int, pfv );    /* Uses typedef type */

다음 예제에서는 typedef 선언을 보여 줍니다.

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

예를 들어, WHOLE은 이제 WHOLE i; 또는 const WHOLE i;와 같은 변수 선언에서 사용할 수 있습니다. 하지만 long WHOLE i; 선언은 유효하지 않습니다.

typedef struct club
{
    char name[30];
    int size, year;
} GROUP;

이 문은 GROUP을 세 멤버가 포함된 구조체 형식으로 선언합니다. 구조체 태그 club도 지정되어 있으므로 typedef 이름(GROUP) 또는 구조체 태그를 선언에서 사용할 수 있습니다. 태그와 함께 struct 키워드를 사용해야 하며, typedef 이름과 함께 struct 키워드를 사용할 수는 없습니다.

typedef GROUP *PG; /* Uses the previous typedef name
                      to declare a pointer            */

PG 형식은 GROUP 형식에 대한 포인터로 선언되며, 이는 다시 구조체 형식으로 정의됩니다.

typedef void DRAWF( int, int );

이 예제에서는 값을 반환하지 않고 두 개의 int 인수를 사용하는 함수에 대한 DRAWF 형식을 제공합니다. 이는 예를 들어 선언이

DRAWF box;

다음 선언과 같음을 의미합니다.

void box( int, int );

참조

선언 및 형식