2017-01-25 3 views
0

열거 형을 8 또는 16 비트로 강제 설정하는 방법에 대한 몇 가지 질문을 보았습니다. 일반적인 대답은 C++ 11 이상에서 수행 될 수 있다는 것입니다. 불행히도, 나는 그 사치가 없다.열거 형 필드를 비트 필드가있는 표준 C에서 8 비트로 강제 변환

그래서 여기에 제가 생각하고있는 것이 있습니다. 크기를 최소화하려는 구조체에있을 때만 열거 형을 8 비트로해야합니다. 그래서 :

옵션 A :

typedef enum { A, B, C, MAX = 0xFF } my_enum; 

struct my_compact_struct 
{ 
    my_enum field1 : 8; // Forcing field to be 8 bits 
    uint8_t something; 
    uint16_t something_else; 
}; 

나는 대부분의 생각 또는 모든 최적화를 처리 할 수있을만큼 똑똑해야 8 효율적으로 비트 필드.

옵션 B :

이 열거를 사용하지 않습니다. typedef와 상수를 대신 사용하십시오.

typedef uint8_t my_type; 

static const my_type A = 0; 
static const my_type B = 1; 
static const my_type C = 2; 

struct my_compact_struct 
{ 
    my_type field1; 
    uint8_t something; 
    uint16_t something_else; 
}; 

옵션 A는 현재 구현 및 작동하는 것 같군,하지만 난 지금하지 일하고있어 그냥 뭐 정확한 무엇 (현재와 미래)하고 싶은 때문에 옵션 B는 분명히 더 나은 경우, 궁금 해서요된다.

감사합니다,

+2

(A)는 필드를 최소화하지 않습니다. 전체 필드의 8 비트 만 사용할 수 있습니다. – StoryTeller

+1

C 및 C++은 다른 언어입니다. 어느 것을 사용합니까? – Olaf

+0

귀하의 질문에 "표준 C"하지만 귀하의 태그는 "C + +"를 포함합니다. 어느 쪽을 사용하고 있습니까? –

답변

4

enum에서 특정 값 (다음 C 구현이 int보다 작은 형태가되도록 enum의 기본 유형을 자유롭게 선택할 수, int보다 작은 유형에 맞게 할 수있는 경우 이 경우 enum 상수의 유형은 int입니다. 그러나 은 없습니다. C 컴파일러가 int보다 작은 유형을 사용하도록 할 수 있습니다. 따라서 이것을 염두에두고 int이 16 비트 이상인 경우 행운입니다.

그러나 C의 enum은 디버깅 보조 기능에 지나지 않습니다. 당신 컴파일러가있는 경우 그냥 uint8_t 유형을 사용 :

static const uint8_t something = /*some value*/ 

을 다음 CHAR_BIT 8.

+0

구현은'enum '에 대해 더 작은 유형을 자유롭게 선택할 수 있습니다. 그러나 상수는 ** 항상 ** int입니다. 그리고'const'는 상수를 한정하지 않습니다. C는'enum-constants' 이외의 상징적 인 상수를 가지고 있지 않습니다. (int보다 다른 타입이 필요하다면 쓸모가 없습니다.) – Olaf

+0

@Olaf : 술집 퀴즈에서 상대방을 상대하지 말 것을 상기시켜주십시오. – Bathsheba

+0

흥미 롭다 ... 전직 상사가 비슷한 것을 말했습니다 :-) – Olaf

2

옵션 B는 가장 좋은 것입니다 char희망를 사용하지 않는 경우. 문제의 유형을 알려진 크기로 정의하고 정의한 const 값도 올바른 크기가됩니다.

enum의 암시 적 번호 매기기를 놓치지 않으려는 동안 필드와 값의 명시적인 크기 조정이이를 보완합니다.

+3

'const' 값은 상수가 아닙니다. 상수 또는'#define '에 대한'enum'이 더 좋습니다. (나는 당신이 타입을 지정할 수 있기 때문에 후자를 추천한다). – Olaf