본문 바로가기

Software/C/C++

[C++] type define struct

***********틀린 예제**********

typedef struct node *ptr;
typedef struct node{
      ptr lchild;
      int data;
      ptr rchild;
} tree;

****************************

typedef는 새로운 형을 만드는 것이다.


아래와 같이 하는 경우는 변수일 뿐입니다.

struct node{       <<----typedef 가 없음
      ptr lchild;
      int data;
      ptr rchild;
}tree;  //변수

node라는 이름의 구조체로 tree라는 변수가 만들어진것이다.
이때는 tree에 대해 tree[10] 등으로 배열형태로 만들수 있다
.

(예1)
struct node{
      ptr lchild;
      int data;
      ptr rchild;
}tree[10];

그러나,

typedef struct node        <<----typedef가 있음
{
      ...
}tree;

이렇게 하시면 tree는 위와 같은 구조체의 데이터형이 된다.
즉, tree가 int, double, float와 같은 것과 비슷한 부류가 되는 것이다.

여기서 tree는 데이터형이지 변수가 아니므로
당연히 tree[10]등이 될 수 없다.
int[10] 이렇게 안되는 것과 같다.

(예2)
typedef struct node{
      ptr lchild;
      int data;
      ptr rchild;
}tree;

tree imsi[10]; //tree는 데이터형 이는 int imsi[10];처럼 된것이다. 고로 정상.

마지막으로 구조체위에
typedef struct node *ptr;
이런 식으로 되어있는데 이는  위에 typedef를 사용하지 않은 구조체가 정의되어있는 상태에서 해당 구조체 아래에 정의되어야 한다.

결론은 다음과 같이 선언할 수 있다.

(예3)
struct node1
{
      ...
};

typedef struct node1 *ptr;

typedef struct node
{
      ptr lchild;
      int data;
      ptr rchild;
}tree;

tree imsi[10];

++++++++++++++++++++++++++++++++

typedef은 무엇이든지 새로운 형태의 형을 만드는 도구이다.

형이 되었으므로 형을 형처럼 잘 사용해야 한다.

----------------------------------------------------------------
typedef - 형재정의 , 함수 포인터의 리턴에서 typedef

----------------------------------------------------------------

unsigned short int 와 같은 긴 이름의 변수명으로 코딩을 할경우
오타로 인한 오류가 생길수가 있다.
이럴경우 typedef로 별칭을 짓는다.

------------------------------------
typedef unsigned short int USI;
void main()
{
        USI k;
        k=8;
}

-------------------------------------


typedef int (*parray)[3][4];


parray p;   //int (*p)[3][4]와 동일.


---------------------------------------


함수 포인터의 리턴

함수 포인터를 리턴해랴 하는경우 함수 포인터의형태를 그대로 사용할수 없으며,typedef문에 의해 재정의 한 후 사용해야 한다.

copy() 함수의 함수 포인터를 리턴해야한다면


typedef char* (*pfunc)(char *s1,const char* s2, int len);

pfunc get_func(void)                         

{

        return (pfunc)copy;                //copy 함수 포인터를 리턴

}


pfunc pcopy;                         //함수 포이터 pcopy를 선언

pcopy =get_func;                    //함수 포인터 pcopy를 사용

pcopy(....);                            //copy()함수 호출...