2014-11-01 105 views
0

我已在程序中使用以下代碼,並在運行PC-Lint時拋出以下錯誤: 此行的多個標記 - (lint:46)field類型應該是int,unsigned int類型或符號int [MISRA 2004年規則6.4,必需] - (皮棉:960)違反MISRA 2004年所需的規則6.4,位字段必須明確地簽署int或 unsigned int類型MISRA錯誤:字段類型應該是int,unsigned int或signed 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'? – 2014-11-01 09:00:23

+1

那麼,布爾什麼? C中沒有'boolean'類型。 – 2014-11-01 09:05:59

+0

很可能,您的編譯器將布爾值定義爲1字節的字符類型。在任何情況下都不要使用位域來解決這個問題,它們是危險的,不可移植的,並且是100%多餘的。 – Lundin 2014-11-10 14:02:58

回答

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 2014-11-10 14:04:08

0

MISRA-C:2004與C:90兼容,它沒有boolean類型。

是完全兼容的位字段必須unsigned intsigned int

或者,您可以記錄的偏差(規則第1.1),以允許使用C99的布爾類型的 - 的理由是直觀的,如相應的MISRA C:2012規則(R 6.1)允許使用位域的布爾值。

[請注意個人檔案免責聲明]

+0

鑑於:'struct {bool flag:1; uint8_t x:7; } foo;'這些字段是否可以放入同一個存儲字節?將'foo.flag = 2;'將值設置爲零或非零值? MISRA規則應該促進可移植性,但我不知道實現會一致對待上述情況。 – supercat 2016-06-24 21:09:53

+0

無論bool是帶符號還是無符號,將值2放入1位大小的變量都是溢出條件。這是一個基本的編碼錯誤! Instinct建議值應該爲0(LSB爲零) – Andrew 2016-07-04 13:37:38

+0

將任何非零值存儲到C99'bool'中相當於存儲值1;如果不打算利用這些優勢,我不知道這種類型對其他任何優勢。 – supercat 2016-07-04 16:27:16

相關問題