programing

Enum과 Define 문 간의 차이

prostudy 2022. 4. 26. 21:52
반응형

Enum과 Define 문 간의 차이

정의문을 사용하는 것과 C/C++의 열거문을 사용하는 것의 차이점은 무엇인가? (그리고 C 또는 C++와 함께 사용할 때 차이점이 있는가?

예를 들어, 언제 사용해야 하는가?

enum {BUFFER = 1234}; 

에 걸쳐서

#define BUFFER 1234   

enum구문 요소를 규정하다

#define프리프로세서 명령어로서 컴파일러가 코드를 보기 에 실행되므로 C 자체의 언어 요소가 아니다.

일반적으로 에넘버들은 활자가 안전하고 더 쉽게 발견될 수 있기 때문에 선호된다.정의는 찾기 어렵고 복잡한 동작을 가질 수 있음(예: 코드 조각 하나가 a를 재정의할 수 있음)#define사사추적. 추적하기 수 있다추적하기 어려울 수 있어

#define문장은 컴파일러가 코드를 보기 전에 사전 테스트에 의해 처리되므로 기본적으로 텍스트 대체(사실 매개변수 등의 사용으로 좀 더 지능적이다)이다.

열거형은 C 언어 자체의 일부분이며 다음과 같은 장점이 있다.

1/ 타입이 있을 수 있고 컴파일러가 타입을 확인할 수 있다.

2/ 컴파일러에서 사용할 수 있기 때문에 디버깅이 용이하도록 디버깅에 대한 기호 정보를 디버거에 따라 디버깅이 쉬워진다.

열거형에서 여러 요소를 하나의 범주에 그룹화할 수 있음:

enum fruits{ apple=1234, orange=12345};

#nowledge는 관련 없는 상수만 생성할 수 있는 반면:

#define apple 1234
#define orange 12345

열거형을 사용하는 것이 타당할 경우 일반적으로 #define보다 Enums가 선호된다.

  • 디버거에서 기호 이름을 표시할 수 있음enum 값s 값("))openType: OpenExisting "보다"가 더 낫다.openType: 2"
  • 당신은 이름 충돌로부터 조금 더 보호를 받지만, 이것은 예전만큼 나쁘지 않다. (대부분의 컴파일러들은 재충전에 대해 경고한다.)#define이션

가장 큰 차이점은 에넘을 유형으로 사용할 수 있다는 점이다.

// Yeah, dumb example
enum OpenType {
    OpenExisting,
    OpenOrCreate,
    Truncate
};

void OpenFile(const char* filename, OpenType openType, int bufferSize);

이렇게 하면 매개변수 유형 확인(openType과 bufferSize를 쉽게 혼용할 수 없음)이 가능하며, 어떤 값이 유효한지 쉽게 찾을 수 있어 인터페이스를 훨씬 쉽게 사용할 수 있다.어떤 IDE는 심지어 당신에게 무감각한 코드완료!

위의 여러 답변에서는 다양한 이유로 열거형을 사용할 것을 권장하지만, 나는 정의를 사용하는 것이 인터페이스를 개발할 때 실질적인 이점이 있다는 것을 지적하고 싶다.당신은 새로운 옵션을 도입할 수 있고 당신은 소프트웨어가 그것들을 조건부로 사용하도록 할 수 있다.

예를 들면 다음과 같다.


#Define OPT_X1 1 /* 버전 1에 소개 */#Define OPT_X2 2 /* 버전 2에 소개 */

그런 다음 어느 버전으로든 컴파일할 수 있는 소프트웨어


#ifdef OPT_X2int 플래그 = OPT_X2;#elseint 플래그 = 0;#endif

열거하는 동안 런타임 피쳐 검출 메커니즘 없이는 이것이 불가능하다.

열거형:

1. 여러 값에 일반적으로 사용됨

2. 열거할 때 두 가지가 있는데 하나는 이름이고 다른 하나는 이름값을 구분해야 하지만 값은 같을 수 있다.값을 정의하지 않으면 열거형 이름의 첫 번째 값은 0초이고 명시적으로 값을 지정하지 않는 한 1이 된다.

3. 타입이 있을 수 있고 컴파일러가 타이핑을 할 수 있다.

4. 디버깅을 쉽게 할 수 있음

5. 수업까지 범위를 제한할 수 있어.

정의:

1. 값을 하나만 정의해야 할 때

2. 일반적으로 한 문자열을 다른 문자열로 대체한다.

3. 전지구적 범위 우리는 범위를 제한할 수 없다.

전반적으로 우리는 열거형을 사용해야 한다.

가능하면 항상 열거형을 사용하는 것이 좋다.열거형을 사용하면 컴파일러에게 소스 코드에 대한 더 많은 정보를 제공할 수 있으며, 전처리기 정의는 컴파일러에 의해 결코 보이지 않기 때문에 더 적은 정보를 전달한다.

예를 들어, 다수의 모드를 구현하기 위해, 열거형을 사용하면 컴파일러가 결측값을 잡을 수 있다.case예를 들어, 스위치에 끼우는 경우.

Define은 전처리기 명령으로, 마치 편집기에서 "모두 바꾸기"를 하는 것과 같으며, 문자열을 다른 문자열로 교체한 다음 결과를 컴파일할 수 있다.

Enum은 예를 들어 다음과 같은 경우 유형의 특별한 경우:

enum ERROR_TYPES
{
   REGULAR_ERR =1,
   OK =0
}

ERROR_TYPES라는 새로운 유형이 있다.RELEAST_ERR가 1로 산출되는 것은 사실이지만, 이 유형에서 int로 주조하는 것은 ( 컴파일러를 높은 장점으로 구성하는 경우) 주조 경고를 생성해야 한다.

요약: 둘 다 비슷하지만, 열거형을 사용할 경우 유형 확인 및 정의를 사용하면 코드 문자열을 교체할 수 있다.

#define은 전처리기 명령어로, 열거형은 C 또는 C++ 언어로 되어 있다.

이런 경우는 항상 #define보다 Enum을 사용하는 것이 좋다.한 가지는 유형 안전이다.또 다른 하나는 열거형에서 시퀀스의 시작 부분만 제시하면 되는 값의 순서가 있을 때 다른 값들은 연속된 값을 얻는다는 것이다.

enum {
  ONE = 1,
  TWO,
  THREE,
  FOUR
};

대신에

#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4

사이드노트로서는 여전히 #define(일반적으로 어떤 매크로의 경우 상수를 포함하는 식별자를 구성할 수 있어야 한다면)을 사용해야 할 경우도 있지만, 그것은 일종의 매크로 흑마술이며, 그 방법이 되는 경우는 매우 드물다.만약 당신이 이 극단들에 간다면 당신은 아마도 C++ 템플릿을 사용해야 할 것이다.

이 단일 상수(버퍼사이즈라고 함)만 원한다면 나는 열거형을 사용하지 않고 정의를 사용할 것이다.나는 우리가 다른 "유형"이나 "사례"를 구별하기 위해 필요한 곳에 (다른 오류 조건을 의미하는) 반환 값과 같은 것에 에넘을 사용할 것이다.그 경우에 우리는 기능 프로토타입 등에 사용할 수 있는 새로운 유형을 만들기 위해 열거형을 사용할 수 있고, 그러면 컴파일러는 그 코드를 더 잘 확인할 수 있다.

이미 쓰여진 모든 것 외에도, 한 사람은 말하지만 드러나지 않았고 그 대신 흥미롭다.예시

enum action { DO_JUMP, DO_TURNL, DO_TURNR, DO_STOP };
//...
void do_action( enum action anAction, info_t x );

행동을 유형으로 생각하면 사물이 분명해진다.정의를 사용하여, 당신은 글을 썼을 것이다.

void do_action(int anAction, info_t x);

적분 상수 값에 대해 나는 선호하게 되었다.enum에 걸쳐서#define사용해도 단점은 없는 것 같다.enum(조금 더 타이핑하면 아주 작은 단점이 있다) 그러나 당신은 이점이 있다.enum반면에 범위가 넓을 수 있다.#define식별자는 모든 것을 트롬핑하는 글로벌 범위를 가지고 있다.

사용.#define보통은 문제가 되지 않지만, 단점이 없기 때문에enum, 나는 그것을 좋아한다.

C++에서 나는 또한 일반적으로 더 선호한다.enumconst intC++ a로 되어 있어도const int( 정수 수 있다. (C는 C와 달리) 왜냐하면 (C는) 문자 그대로 수정이 가능하기 이다.enumC에게 휴대할 수 있다.

상수 그룹(예: "Days of the Week")이 있으면 그룹화됨을 나타내기 때문에 상수 그룹(예: "Days of the Week")이 선호되며, 제이슨이 말했듯이 유형 안전하다.(버전 번호와 같은) 글로벌 상수라면, 그게 더 많이 쓰일 겁니다.#define비록 이것이 많은 논쟁의 주제이긴 하지만.

위에 열거한 좋은 점 외에도 에누스의 범위를 클래스, 구조체 또는 네임스페이스로 제한할 수 있다.개인적으로, 나는 어느 때라도 최소의 관계 기호들을 적용범위에 두는 것을 좋아하는데, 이것은 #defines 보다는 enums를 사용하는 또 다른 이유다.

정의 목록에 대한 열거형의 또 다른 장점은 컴파일러(적어도 gcc)가 스위치 문에서 모든 값을 체크하지 않을 때 경고를 발생시킬 수 있다는 것이다.예를 들면 다음과 같다.

enum {
    STATE_ONE,
    STATE_TWO,
    STATE_THREE
};

...

switch (state) {
case STATE_ONE:
    handle_state_one();
    break;
case STATE_TWO:
    handle_state_two();
    break;
};

이전 코드에서 컴파일러는 열거형의 모든 값이 스위치에서 처리되지 않는다는 경고를 생성할 수 있다.만약 주들이 #define's처럼 행해진다면, 이것은 그렇지 않을 것이다.

Enums는 일주일 중 며칠과 같은 어떤 종류의 세트를 열거하는데 더 많이 사용된다.만약 당신이 단 한 개의 상수만 필요하다면,const int(또는 이중 등)은 열거하는 것보다 확실히 나을 것이다.나는 개인적으로 좋아하지 않는다.#define(적어도 일부 상수의 정의에 대해서는 그렇지 않다) 형식적인 안전성을 주지 못하기 때문에, 하지만, 물론 자신에게 더 잘 맞으면 사용할 수 있다.

열거형을 생성하면 리터럴뿐만 아니라 다음과 같은 리터럴을 그룹화하는 유형도 생성된다.이것은 컴파일러가 확인할 수 있는 당신의 코드에 의미를 더한다.

게다가 디버거를 사용할 때는 열거형 리터럴의 값에 접근할 수 있다.이것은 항상 #define의 경우는 아니다.

차이가 거의 없다.C Standard에 따르면 열거형에는 적분형이 있고 열거형 상수는 int형이기 때문에 두 가지 모두 오류 없이 다른 적분형과 자유롭게 혼합될 수 있다. (반면, 명시적인 깁스 없이 그러한 혼입이 허용되지 않는다면, 열거형의 현명한 사용은 특정 프로그래밍 오류를 잡을 수 있다.)

열거형의 몇 가지 장점은 숫자 값이 자동으로 할당되고, 디버거가 열거 변수를 검사할 때 기호 값을 표시할 수 있으며, 블록 범위를 준수한다는 것이다.(열람이 엄격히 불법은 아니지만 여전히 나쁜 스타일로 간주될 수 있으므로, 컴파일러는 무차별적으로 혼합될 때 치명적이지 않은 경고를 생성할 수도 있다.)단점은 프로그래머가 그러한 치명적이지 않은 경고를 거의 통제하지 못한다는 것이다. 일부 프로그래머들은 또한 열거형 변수의 크기를 통제하지 못하는 것에 대해 분개한다.

참조URL: https://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements

반응형