programing

열거형 내에서 이러한 #정의의 목적은 무엇입니까?

bestprogram 2023. 10. 14. 10:25

열거형 내에서 이러한 #정의의 목적은 무엇입니까?

리눅스 헤더에서 /usr/include/distent 코드를 찾았습니다.h:

enum   
  {    
    DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
    DT_FIFO = 1,
# define DT_FIFO    DT_FIFO   
    DT_CHR = 2,
# define DT_CHR     DT_CHR
    DT_DIR = 4,
# define DT_DIR     DT_DIR
    DT_BLK = 6,
# define DT_BLK     DT_BLK
    DT_REG = 8,
# define DT_REG     DT_REG
    DT_LNK = 10,
# define DT_LNK     DT_LNK
    DT_SOCK = 12,
# define DT_SOCK    DT_SOCK   
    DT_WHT = 14
# define DT_WHT     DT_WHT
  };   

이 구문은 무엇을 위한 것입니까? - 동일한 문자열로 정의한 다음 int 값으로 컴파일하는 이유는 무엇입니까?

다른 좋은 답변들 외에도 - 나는 주요한 이유로 그들과 함께 갈 것입니다 - 당신이 재정의하려고 하면 컴파일러는 경고나 오류를 생성할 수 있습니다.DT_UNKNOWN.

그러면 다른 코드가 #ifdef를 사용하여 이러한 열거값 중 하나(또는 그 이상)가 정의되었는지 확인할 수 있을 것입니다.

내 (교육받지 않은) 추측으로는#define문장을 사용하면 조건부 테스트에서 상수가 정의되었는지 여부를 확인할 수 있습니다.

예를 들어,

#ifdef DT_UNKNOWN
    // do something
#endif

루치앙 그리고르의 대답이 맞았다고 생각합니다.

정의되지 않은 코드:

#include <stdio.h>

// Defined somewhere in headers
#define DT_UNKNOWN 0

enum
{
    DT_UNKNOWN = 0,
    DT_FIFO = 1,
};

int main(int argc, char **argv)
{
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN);
    return 0;
}

컴파일러의 출력을 보면 열거형 안에 있는 코드 라인 중 일부가 빌드를 원하지 않는 이유는 불분명합니다.

alexander@ubuntu-10:~/tmp$ gcc -Wall ./main.c 
./main.c:7: error: expected identifier before numeric constant

이러한 정의를 추가하면 다음과 같습니다.

#include <stdio.h>

// Defined somewhere in headers
#define DT_UNKNOWN 0

enum
{
    DT_UNKNOWN = 0,
    # define DT_UNKNOWN DT_UNKNOWN
    DT_FIFO = 1,
    # define DT_FIFO    DT_FIFO
};

int main(int argc, char **argv)
{
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN);
    return 0;
}

컴파일러는 DT_UNKNOWN이 재정의되고 재정의되는 장소를 알려줍니다.

alexander@ubuntu-10:~/tmp$ gcc -Wall ./main2.c 
./main2.c:7: error: expected identifier before numeric constant
./main2.c:8:1: warning: "DT_UNKNOWN" redefined
./main2.c:3:1: warning: this is the location of the previous definition

사용했습니다.-E그리고.-dD논쟁(그리고 또한)-fdump-tree-all)에서gcc프리프로세서 출력을 확인해 보았지만 아무 유용한 것도 발견하지 못했습니다.그래서 나는 이 코드가 디버거 같은 것을 사용해서 디버깅할 때 심볼 이름을 표시하는 것 외에는 어떤 기능도 가지고 있지 않다고 생각합니다.gdb.

언급URL : https://stackoverflow.com/questions/8588649/what-is-the-purpose-of-a-these-define-within-an-enum