programing

C에서 typedef와 typedef enum을 사용하려면 어떻게 해야 하나요?

prostudy 2022. 7. 5. 22:02
반응형

C에서 typedef와 typedef enum을 사용하려면 어떻게 해야 하나요?

고려사항:

#define MAXROW 20
#define MAXCOL 60
typedef State Grid[MAXROW+2] [MAXCOL+2]
typedef enum state {DEAD,ALIVE} State

제가 어떻게 이용합니까typedef그리고.typedef enumC로요? 코드의 이 부분은 어떤 역할을 하죠?

typedef enum state {DEAD,ALIVE} State;
|     | |                     | |   |^ terminating semicolon, required! 
|     | |   type specifier    | |   |
|     | |                     | ^^^^^  declarator (simple name)
|     | |                     |    
|     | ^^^^^^^^^^^^^^^^^^^^^^^  
|     |
^^^^^^^-- storage class specifier (in this case typedef)

typedef키워드는 의사 스토리지 클래스 지정자입니다.구문론적으로는 스토리지 클래스 지정자가 다음과 같은 장소에서 사용됩니다.extern또는static사용됩니다.스토리지와는 관계가 없습니다.이는 선언이 명명된 객체의 존재를 소개하는 것이 아니라 형식 별칭인 이름을 도입하는 것을 의미합니다.

상기의 선언 후에StateID는 타입의 에일리어스가 됩니다.enum state {DEAD,ALIVE}선언은 그 유형 자체도 제공합니다.하지만 그렇지 않다typedef하고 있어요.어떤 선언이든enum state {DEAD,ALIVE}는 타입 지정자가 스코프에 그 타입을 도입하는 것으로 표시됩니다.

enum state {DEAD, ALIVE} stateVariable;

한다면enum state이미 소개된 바 있습니다.typedef다음과 같이 적어야 합니다.

typedef enum state State;

그렇지 않으면enum재정의되고 있습니다.이것은 에러입니다.

다른 선언(함수 파라미터 선언 제외)과 마찬가지로typedef선언에는 쉼표로 구분된 여러 선언자를 사용할 수 있습니다.또한, 이들은 단순한 이름뿐만 아니라 다음과 같은 선언자가 될 수 있습니다.

typedef unsigned long ulong, *ulongptr;
|     | |           | |  1 | |   2   |
|     | |           | |    | ^^^^^^^^^--- "pointer to" declarator
|     | |           | ^^^^^^------------- simple declarator
|     | ^^^^^^^^^^^^^-------------------- specifier-qualifier list
^^^^^^^---------------------------------- storage class specifier

이것.typedef에는 2종류의 이름이 도입되어 있습니다.ulong그리고.ulongptr(기준)unsigned longtype을 지정합니다. ulong그냥 그런 종류의 가명일 뿐이에요 ulongptr에 대한 포인터로서 선언되다unsigned long그 덕분에*구문, 이것은 이 역할에서 의도적으로 단항체를 모방하는 일종의 유형 구성 연산자입니다.*표현식에 사용되는 포인터 참조용입니다.바꿔 말하면ulongptr에일리어스입니다.unsigned long" 라고 입력합니다.

에일리어스는ulongptr 와는 다른 타입이 아니다.unsigned long *이 코드는 유효한 코드이며 진단이 필요하지 않습니다.

unsigned long *p = 0;
ulongptr q = p;

변수q그리고.p정확히 같은 타입입니다.

에일리어스typedef텍스트가 아닙니다.예를 들어 만약user_id_t는 입니다.typedef유형 이름int단순하게는 할 수 없습니다.

unsigned user_id_t uid;  // error! programmer hoped for "unsigned int uid". 

잘못된 유형 지정자 목록입니다.unsignedtypedef 이름을 사용합니다.위의 내용은 C 프리프로세서를 사용하여 실행할 수 있습니다.

#define user_id_t int
unsigned user_id_t uid;

그래서user_id_t토큰에 매크로가 할당됩니다.int구문 분석 및 번역에 앞서 있습니다.이것이 장점으로 보일 수 있지만 잘못된 것입니다.새로운 프로그램에서는 이 점을 피하십시오.

파생형에서는 잘 작동하지 않는 단점으로는 다음과 같습니다.

 #define silly_macro int *

 silly_macro not, what, you, think;

이 선언은 선언하지 않습니다.what,you ★★★★★★★★★★★★★★★★★」thinkint" int"이기 에 "int"됩니다.이는 매크로가 다음과 같기 때문입니다.

 int * not, what, you, think;

유형 지정자는 다음과 같습니다.int선언자는 다음과 같습니다.*not,what,you ★★★★★★★★★★★★★★★★★」thinknot에는 예상된 포인터 유형이 있지만 나머지 식별자는 없습니다.

그것이 99%에 대한 모든 의 99이다.typedef에일리어싱

typedef에 새로운 데이터 유형을 정의합니다.하다

typedef char* my_string;
typedef struct{
  int member1;
  int member2;
} my_struct;

이제 이러한 새로운 데이터 유형을 사용하여 변수를 선언할 수 있습니다.

my_string s;
my_struct x;

s = "welcome";
x.member1 = 10;

★★★의 enum 이 조금. 를 들어 이치노

enum Ranks {FIRST, SECOND};
int main()
{
   int data = 20;
   if (data == FIRST)
   {
      //do something
   }
}

를 사용합니다.typedef enum는 다음 의 에일리어스를

typedef enum Ranks {FIRST, SECOND} Order;
int main()
{
   Order data = (Order)20;  // Must cast to defined type to prevent error

   if (data == FIRST)
   {
      //do something
   }
}

언급URL : https://stackoverflow.com/questions/20426716/how-do-i-use-typedef-and-typedef-enum-in-c

반응형