2010-02-17 2 views
7

나는int가 아닌 다른 형식의 비트 필드?

typedef struct my{ 
    const char *name; 
    uint8_t is_alpha : 1; 
    uint8_t is_hwaccel : 1; 
    uint8_t x_chroma_shift; 
    uint8_t y_chroma_shift; 

} mystr; 

uint8_tunsigned char에 형식 정의되어 다음과 같이 선언 비트 필드를 사용하는 코드가 있습니다.

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. 비트 필드 INT 이외의 다른 유형을 사용하여이 문제/잠재적 인 문제가이 비트 필드를 사용하여 MS-VS 2008의 코드를 구축

    다음과 같이 경고를 준다? 왜 경고 야?

  2. C99 C 언어 사양에서 허용하는 int 유형 비트 필드 이외입니까?
+1

경고는 매우 자명합니다. __nonstandard extension used__; 코드에 이식성 문제가있을 수 있습니다. –

+0

@Mehrad : int 형을 사용하는 것은 모든 타겟/컴파일러가 같은 크기의 int를 갖는 경우에만 이식성 측면에서 유용합니다. – goldenmean

+0

여기에서 비트 필드에 관해 쓰고 있습니다. 코드에서 크기가 지정되어 있습니다. – AProgrammer

답변

4

1] int 이외의 다른 유형의 비트 필드를 사용할 때 문제가 있습니까? 왜 경고 야?

비트 필드가 낮은 수준이므로 비표준 유형을 사용하는 경우 이식성에 문제가있을 수 있습니다. 그러므로 경고 - 여전히 경고이고 오류는 아니라는 점에 유의하십시오.

2] C99 C 언어 사양에서 허용하는 int 유형 비트 필드 이외입니까? C99의 초안에서

:

6.7.2.1 구조와 조합 지시자

4 비트 필드는 의하거나 규정 버전 인 형태를 가진다 _Bool, signed int, unsigned int 또는 기타 구현 정의 유형입니다.

+7

표준 문서에서 "다른 구현 정의 유형"이 현저하게 쓸모 없습니까? –

+0

@Neil Butterworth : ATM, 방금 초안을 받았습니다. 그래도 실제를 찾아야합니다. 하지만 네가 맞다고 생각 하네. – dirkgently

+0

@dirkgently : int 형을 사용하면, 모든 타겟/컴파일러가 같은 사이즈의 int를 가지는 경우에만, 이식성 측면에서 유용합니다. 이것은 합리적인 가정입니까? Idon't는 내가 묻고있는 thats를 알고있다. – goldenmean

1

int을 사용하지 않으시겠습니까? 비트 필드의 실제 구현은 컴파일러마다 다릅니다. 이식 가능한 코드를 작성하려면 int을 사용하십시오. 작은 구조 나 고정 된 바이트 수의 구조 또는 비트가 고정 된 위치에있는 구조를 만들려면 비트 필드를 사용하지 마십시오. flags과 같은 이름의 uint8_t 멤버를 만들고 비트 마스크로 사용할 매크로를 정의하십시오.

+0

'unsigned int'를 의미합니다. 'uint8_t'는 부호가 없으며'int'는 서명되어 있습니다. – kennytm

+0

개인적으로 코드에서 비트 필드를 사용하지는 않았지만 1 비트 비트 필드 인 경우 부호가 중요합니까? – tomlogic

관련 문제