무엇이 C에서 더 나은 상수, 매크로 또는 열거를 만들 수 있습니까?
매크로나 열거형을 언제 사용해야 할지 혼란스럽습니다.두 가지 모두 상수로 사용할 수 있지만, 두 가지의 차이점은 무엇이며 두 가지 모두의 장점은 무엇입니까?컴파일러 수준과 관련이 있습니까?
가독성 측면에서 열거형은 관련 값이 함께 그룹화되어 있기 때문에 매크로보다 더 나은 상수를 만듭니다. 외에 게가다.enum
에서는 새 유형을 정의하므로 프로그램의 판독기에서 해당 매개 변수로 전달할 수 있는 항목을 쉽게 파악할 수 있습니다.
비교하다
#define UNKNOWN 0
#define SUNDAY 1
#define MONDAY 2
#define TUESDAY 3
...
#define SATURDAY 7
로.
typedef enum {
UNKNOWN,
SUNDAY,
MONDAY,
TUESDAY,
...
SATURDAY,
} Weekday;
이렇게 코드를 읽는 것이 훨씬 쉽습니다.
void calendar_set_weekday(Weekday wd);
이보다
void calendar_set_weekday(int wd);
통과해도 괜찮은 상수를 알고 있기 때문입니다.
매크로는 사전 처리된 것이며 컴파일된 코드는 사용자가 만든 식별자에 대해 전혀 알지 못합니다.코드가 컴파일러에 도달하기 전에 이미 프리프로세서로 대체되었습니다.열거형은 컴파일 시간 엔티티이며 컴파일된 코드는 디버거(및 기타 도구)에서 사용할 수 있는 기호에 대한 전체 정보를 유지합니다.
가능한 경우 열거형을 선호합니다.
C에서는 실제 열거에 대해 열거형을 사용하는 것이 가장 좋습니다. 즉, 일부 변수가 이름을 지정할 수 있는 여러 값 중 하나를 포함할 수 있는 경우입니다.열거형의 한 가지 장점은 컴파일러가 언어가 요구하는 것 이상으로 몇 가지 검사를 수행할 수 있다는 것입니다. 예를 들어 열거형의 스위치 문이 대소문자 중 하나를 놓치지 않는다는 것입니다.열거형 식별자는 디버깅 정보에도 전파됩니다.디버거에서 식별자 이름을 숫자 값이 아닌 열거형 변수의 값으로 볼 수 있습니다.
열거형은 적분 형식의 기호 상수를 만드는 부작용에만 사용할 수 있습니다.예를 들어:
enum { buffer_size = 4096 }; /* we don't care about the type */
이 관행은 그렇게 널리 퍼져 있지 않습니다. 첫째로, 하는나,buffer_size
열거형이 아닌 정수로 사용됩니다.는 디거가렌지않음되를 렌더링하지 .4096
안으로buffer_size
이 값은 열거된 유형으로 표시되지 않기 때문입니다.이 약간의 경우는하언을 한다면.char array[max_buffer_size];
그리고나서sizeof array
으로 .buffer_size
이 경우 열거 상수는 컴파일 시 사라지므로 매크로가 될 수 있습니다.그고정유통형수제것같있단다습니점이은 (이 있을 수 .번역의 전처리 단계의 출력이 텍스트로 캡처되는 경우에는 약간의 이점이 있을 수 있습니다.매크로는 4096으로 바뀌었을 것이지만, 반면에buffer_size
로 남을 것입니다.buffer_size
).
전처리기 기호를 사용하면 다음을 수행할 수 있습니다.
#define buffer_size 0L /* buffer_size is a long int */
C의 값 다 합 에서 이 나온다는 하십시오.<limits.h>
맘에 들다UINT_MAX
이러한 식별자는 정확하게 결정된 유형을 가져야 하기 때문에 충분한 이유가 있는 사전 처리기 기호이며 열거형 기호가 아닙니다.전처리기 기호의 또 다른 장점은 해당 기호의 존재 여부를 테스트하거나 값을 기반으로 의사 결정을 내릴 수 있다는 것입니다.
#if ULONG_MAX > UINT_MAX
/* unsigned long is wider than unsigned int */
#endif
물론 열거된 상수도 테스트할 수 있지만 결과에 따라 전역 선언을 변경할 수는 없습니다.
열거형은 비트 마스크에도 적합하지 않습니다.
enum modem_control { mc_dsr = 0x1, mc_dtr = 0x2, mc_rts = 0x4, ... }
값이 비트 OR과 결합되면 유형 밖의 값이 생성되기 때문에 말이 안 됩니다.이러한 코드는 (약간 더 많은) 유형 안전 열거를 가진 C++로 전송될 경우에도 두통을 유발합니다.
매크로와 열거형 사이에는 몇 가지 차이점이 있으며, 이러한 속성 중 하나로 인해 특정 상수로 적합하지 않을 수 있습니다.
- enums가 부호화되었습니다(int와 호환됨).서명되지 않은 유형이 필요한 모든 컨텍스트(특히 비트 연산을 생각해 보십시오!)에서 열거형은 제외됩니다.
- long이 int보다 넓으면 큰 상수가 열거형에 적합하지 않습니다.
- 열거크일는기 (의반으로)입니다.
sizeof(int)
값의 작은값가어예의이경우레진을예▁of()의 :CHAR_MAX
) 당신은 원할지도 모릅니다.char foo[]
금도보다 .enum foo[]
vmdk - 열거형은 정수입니다.당신은 가질 수 없습니다.
enum funny_number { PI=3.14, E=2.71 }
. - 열거형은 C89 기능입니다. K&R 컴파일러(고대의 것으로 인정됨)는 이를 이해하지 못합니다.
매크로가 제대로 구현되면(즉, 대체될 때 연관성 문제가 발생하지 않음) 매크로 상수와 열거 상수가 모두 적용되는 상황, 즉 특별히 서명된 정수 상수가 필요한 상황에서 매크로 상수와 열거 상수 사이의 적용 가능성에 큰 차이가 없습니다.
그러나 일반적으로 매크로는 훨씬 더 유연한 기능을 제공합니다.합니다. 은 "" "" "" "" ""입니다. 상수에는 유형이 있습니다.int
(또는 더 큰 부호 있는 정수 유형일 수 있음), 이들은 항상 서명됩니다.매크로를 사용하면 상수 구문, 접미사 및/또는 명시적 유형 변환을 사용하여 모든 유형의 상수를 생성할 수 있습니다.
열거형은 밀접하게 연관된 순차 정수 상수 그룹이 있을 때 가장 잘 작동합니다.상수의 실제 값에 대해 전혀 관심이 없을 때, 즉 올바른 동작을 하는 고유한 값만 관심을 가질 때 특히 효과가 좋습니다.다른 모든 경우 매크로가 더 나은 선택(또는 기본적으로 유일한 선택)입니다.
실질적인 문제로서, 거의 차이가 없습니다.프로그램에서 상수와 동일하게 사용할 수 있습니다.어떤 사람들은 스타일적인 이유로 둘 중 하나를 선호할 수도 있지만, 저는 어떤 기술적인 이유로 둘 중 하나를 선호할 수 없습니다.
한 가지 차이점은 매크로를 사용하면 관련 상수의 정수 유형을 제어할 수 있다는 것입니다.그러나enum
를 사용합니다.int
.
#define X 100L
enum { Y = 100L };
printf("%ld\n", X);
printf("%d\n", Y); /* Y has int type */
enum
이점 있음: 블록 범위:
{ enum { E = 12 }; }
{ enum { E = 13 }; }
매크로를 사용하면 다음과 같은 작업이 필요합니다.#undef
.
언급URL : https://stackoverflow.com/questions/17125505/what-makes-a-better-constant-in-c-a-macro-or-an-enum
'programing' 카테고리의 다른 글
VBA: 여러 작업을 포함하는 단일 행 if 문 (0) | 2023.06.17 |
---|---|
Playstore에 게시한 후 Google 로그인이 작동하지 않음 (0) | 2023.06.17 |
워드프레스:필터가 있는 보관 페이지가 작동하지 않음(ACF) (0) | 2023.06.12 |
C: 부호 없는 피연산자에 대한 일항 빼기 연산자 동작 (0) | 2023.06.12 |
마리아의 동적 피벗 열 이름에 공백이 있습니다.DB (0) | 2023.06.12 |