열거형 내에서 이러한 #정의의 목적은 무엇입니까?
리눅스 헤더에서 /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
'programing' 카테고리의 다른 글
rails3 rails.js 및 jquery ajax 요청의 성공 및 실패 탐지 (0) | 2023.10.19 |
---|---|
CORS 정책에 의해 오리진에서 글꼴에 대한 액세스가 차단되었습니다.요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다. (0) | 2023.10.14 |
C에서 stdout을 덮어쓰는 방법 (0) | 2023.10.14 |
워드프레스 아약스 기법 (0) | 2023.10.14 |
워드에서 제출 양식을 만들려면 PHP를 누릅니다. (0) | 2023.10.14 |