2014-11-01 9 views
0

내 프로그램에서 다음 코드를 사용했으며 PC-Lint를 실행하는 동안 다음 오류가 발생합니다 : 이 줄에 여러 마커가 있습니다. - (lint : 46) 필드 유형 INT, 부호 INT 또는 서명 INT를해야한다 [MISRA이 규칙 6.4, 필요한 2004] - (보풀 : 960) MISRA 2004 필요한 규칙 6.4 위반 비트 필드가 명시 적으로 서명해야합니다 INT 또는 부호 INTMISRA 오류 : 필드 유형이 int, 부호없는 int 또는 부호가있는 int 여야합니다.

typedef struct{ 
    boolean ch8 :1; 
    boolean Ch7 :1; 
    boolean Ch6 :1; 
    boolean Ch5 :1; 
    boolean Ch4 :1; 
    boolean Ch3 :1; 
    boolean Ch2 :1; 
    boolean Ch1 :1; 
} Channel; 

누군가이 문제를 해결할 수있는 방법을 말해 줄 수 있습니까?

+0

무엇이'DC_BOOL'입니까? –

+1

글쎄,'부울 '이란 무엇입니까? C에'boolean' 타입이 없습니다. –

+0

대부분의 경우 컴파일러는 부울을 1 바이트 문자 유형으로 정의합니다. 어떤 상황에서도 비트 필드를 절대로 사용하지 않으면이 문제를 해결할 수 있습니다. 위험하고 이식성이 없으며 100 % 불필요합니다. – Lundin

답변

2

당신은 이런 식으로 할 필요가 :

typedef struct{ 
    unsigned int ch8 :1; 
    unsigned int Ch7 :1; 
    unsigned int Ch6 :1; 
    unsigned int Ch5 :1; 
    unsigned int Ch4 :1; 
    unsigned int Ch3 :1; 
    unsigned int Ch2 :1; 
    unsigned int Ch1 :1; 
} Channel; 

비트 필드가 허용하는 유일한 유형, 정수 유형입니다.

+0

이 작업을 수행 할 때 비트가 거의 임의의 방식으로 끝날 수 있습니다. [이 참조하십시오 (http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223). – Lundin

0

MISRA-C : 2004는 boolean 유형이없는 C : 90과 호환됩니다. 같이 이론적 근거는 간단 것 -

는 (1.1 규칙)의 편차를 문서화 할 수있는 C99 부울 형식의 사용을 허용하는 완벽하게 준수 비트 필드 또는 unsigned int 또는 signed int

해야 할하려면 해당 MISRA C : 2012 규칙 (R 6.1)은 비트 필드에 대해 부울 값의 사용을 허용합니다.

[프로필주의 사항에 유의하십시오]

+0

주어진다 :'struct {bool flag : 1; uint8_t x : 7; } foo;'필드가 같은 저장 공간의 바이트에 배치 될 수 있습니까? 'foo.flag = 2;'값을 0 또는 0이 아닌 값으로 설정하겠습니까? MISRA 규칙은 이식성을 촉진하기로되어 있지만 구현이 위의 내용을 일관되게 처리한다는 것을 모릅니다. – supercat

+0

값 2를 1 비트 크기 변수에 넣는 것은 부울이 부호가 있거나 부호가 없든 오버 플로우 조건입니다. 그것은 기본적인 코딩 오류입니다! Instinct는 값이 0 (LSB가 0 임)을 제시합니다. – Andrew

+0

C99'bool '에 0이 아닌 값을 저장하는 것은 값 1을 저장하는 것과 같습니다. 나는 유형이 그 이점을 이용하지 않는다면 다른 어떤 것보다 가질 수있는 이점을 모른다. – supercat