2010-02-17 46 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_t被Typedef的到unsigned char代碼。

使用該位字段構建代碼的MS-VS 2008提供瞭如下警告:

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. 是否有任何問題/潛在問題,在使用除int之外類型的位字段?爲什麼警告?
  2. 除了C99 C語言規範允許的int型位文件外,還有其他的嗎?
+1

這個警告是不言自明的:__nonstandard extension used__;你的代碼可能有可移植性問題。 – 2010-02-17 12:28:00

+0

@Mehrad:只有當所有目標/編譯器具有相同大小的整數時,使用int類型纔可用於可移植性方面。 – goldenmean 2010-02-17 12:51:01

+0

您正在寫關於位域的信息,它們的大小在代碼中指定。 – AProgrammer 2010-02-17 13:27:15

回答

4

1]在使用int類型以外的位域時是否存在任何問題/潛在問題?爲什麼警告?

由於位字段是低級別的,因此如果您使用的是非標準類型,則可能存在可移植性問題。因此警告 - 注意它仍然是一個警告,而不是一個錯誤。

2]除了C99 C語言規範允許的int型位文件之外,還有其他類型的位文件嗎?

從C99的草案:

6.7.2.1結構和聯合說明

4位字段應該有一個類型,它是 的 合格或不合格的版本_Bool,signed int,unsigned int或其他實現定義的 類型。

+7

標準文檔中的「某些其他實現定義類型」是否顯着無用? – 2010-02-17 12:34:28

+0

@尼爾·巴特沃斯:ATM,我只是吃草稿。需要查看實際情況。但是,是的,我想你是對的。 – dirkgently 2010-02-17 12:42:11

+0

@dirkgently:只有在所有目標/編譯器都保證具有相同大小的整數時,使用int類型纔可用於可移植性方面。這是一個合理的假設。我不知道這就是爲什麼我問。 – goldenmean 2010-02-17 12:51:57

1

爲什麼不使用int?位編碼器的實際實現因編譯器而異。如果您想編寫便攜式代碼,請使用int。如果你想創建一個小的結構,或者一個固定的字節數的結構,或者一個結構的位數是固定的,不要使用位域。創建一個名爲flagsuint8_t成員,並將宏定義爲位掩碼。

+0

你的意思是'unsigned int'。 'uint8_t'是無符號的,'int'是有符號的,混合它們是不好的。 – kennytm 2010-02-17 16:49:33

+0

我沒有親自使用代碼中的位域,但是如果它是1位的位域,符號是否有用? – tomlogic 2010-02-17 16:58:15

相關問題