C 구조체 typedef - sonkoni/Koni-Wiki GitHub Wiki

구조체 별칭

typedef 자료형 별칭;   // 자료형의 별칭 정의
typedef 자료형* 별칭;  // 자료형 포인터의 별칭 정의

== 구조체 별칭 정의 ==
// 제일 많이 사용하는 방법. 이 형태에서 구조체이름과 구조체별칭을 동일하게 하면 여러모로 편함.
typedef struct 구조체이름 {
    자료형 멤버이름;
} 구조체별칭;

== 구조체 별칭 선언 ==
구조체별칭 변수이름;

== 별칭만 있는 익명 구조체 정의 ==
typedef struct {
    자료형 멤버이름;
} 구조체별칭;

== 별칭 따로 선언 ==
struct 구조체이름 {
    자료형 멤버이름;
};
typedef struct 구조체이름 구조체별칭;

별칭으로 구조체 정의

typedef 자료형 별칭
typedef 자료형* 별칭

typedef struct 구조체이름 {
    자료형 멤버이름;
} 구조체별칭;

가장 많이 사용하는 방법이다. 보통 이렇게 사용할 때는 구조체이름과 구조체별칭을 같게 해서 코드에서 type 이나 tag 구분 없이 사용하게 된다. 이름이 겹쳐도 서로 다른 이름공간에 들어가기 때문에 상관없다. 컴파일러는 다 구분 잘 한다.

#include <stdio.h>

typedef struct Person_t {
    char name[20];
    int age;
    char address[100];
} Person;

int main(int argc, char *argv[]) {
    
    // 별칭을 사용했을 때와 구조체 이름을 사용했을 때
    struct Person_t p1 = {.name = "Leonardo DiCaprio", .age = 47, .address = "Hollywood, USA"};
    Person p2 = {.name = "Dwayne Johnson", .age = 50, .address = "Hollywood, USA"};
    // 이 둘의 구별이 의미없기 때문에
    // 보통은 구조체이름도 Person 으로 그냥 통일해버린다.

    printf("1 => %s, %d, %s\n", p1.name, p1.age, p1.address);
    printf("2 => %s, %d, %s\n", p2.name, p2.age, p2.address);

    return 0;
}
// 이렇게 해 두는 것이 제일 낫더라.
typedef struct Person {
    char name[20];
    int age;
    char address[100];
} Person;

익명구조체

typedef struct {
    자료형 멤버이름;
} 구조체별칭;

다 귀찮은 경우에는 구조체 이름은 생략해버리고 별칭 이름으로만 쓰는 경우가 있다. 그러나 이는 코드에서 별칭이 아니라 구조체 이름을 써야 하는 경우가 있는데 그럴 때 난감해진다. 구조체 이름을 생략하는 건 '가능하다' 정도만 알고 실전에서는 사용하지 않는 게 낫다.

typedef struct {
    char name[20];
    int age;
    char address[100];
} Person;

struct Person_t p1 = {......} // 이런 형태는 못 쓴다. 구조체 이름이 없기 때문
Person p2 = {.........}       // 이런 형태만 가능하다. 
⚠️ **GitHub.com Fallback** ⚠️