'typedef'는 새로운 타입 이름(별칭)을 생성하기 위한 강력한 도구로, 코드를 보다 간결하고 유지 보수 및 이해하기 쉽게 만듭니다. 이 키워드는 C의 초기 버전에서 등장하여, 긴 구조체 및 포인터 선언으로 인해 코드가 읽기 어렵고 유지보수가 힘든 대형 프로젝트의 개발자들에게 편리함을 제공했습니다.
원래 구조체와 공용체는 struct, union, enum 키워드를 사용하여 긴 선언으로 정의되었습니다. 코드가 성장함에 따라 이러한 선언은 중복적이고 불편해져서 및 타입을 줄이고 표준화하기 위해 typedef가 도입되었습니다.
일반적인 오류는 별칭에 대한 잘못된 이해, typedef와 구조체 선언 혼합, 익명 구조체, 포인터 배열의 어려움 및 문서화되지 않은 명명 규칙 문제와 관련이 있습니다.
'typedef'는 기존 타입에 짧은 이름을 부여할 수 있게 해줍니다 — 기본 타입과 복합 타입 모두:
코드 예시:
typedef struct Point { int x, y; } Point; Point p1; // 대신 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
주요 특징:
1. typedef를 사용하여 "새로운 타입"을 생성하여 기본 타입(int 등)과 호환되지 않게 만들 수 있습니까?
안 됩니다. typedef는 단지 별칭만 제공할 뿐이며, 컴파일러 수준에서의 타입은 동일하게 유지되어 컴파일 오류 없이 변환이 가능합니다.
2. typedef struct {} name_t; 로 선언한 후 struct name_t var;를 하면 결과는 무엇입니까?
오류입니다! typedef struct MyStruct { ... } Name; 후, 변수에 대해 Name을 사용해야 하며 struct Name을 사용할 수 없습니다. struct Name은 컴파일러에 알려져 있지 않기 때문에 작동하지 않습니다.
3. typedef int arr[10]; arr a,b; a와 b의 타입은 무엇입니까?
a와 b는 모두 길이가 10인 int 배열입니다. 이는 포인터가 아닙니다! 배열과 포인터에 대한 typedef의 특성을 잊으면 'int* a, b'를 예상하는 오류가 발생할 수 있습니다.
프로젝트에서는 typedef struct User { ... } User;를 선언했지만 struct User my_user;를 사용했습니다. — 컴파일러가 오류를 표시하며, 코드는 이식성이 없습니다.
장점:
단점:
프로젝트 전반에 걸쳐 하나의 표준을 따릅니다: typedef struct {...} Name;을 사용하고, struct 없이 오직 Name var;만 사용합니다.
장점:
단점: