2013-12-19 53 views
6

以下片段來自我的zigbee wsndemo代碼讓我很難理解結構。我在網上瀏覽了許多與結構相關的文章,但並不瞭解這些結構變量是如何定義和可以使用的。請幫忙。嵌入式c編程

 static struct 
    { 
     uint8_t appSubTaskPosted : 1; 
     uint8_t appCmdHandlerTaskPosted : 1; 
     uint8_t appMsgSenderTaskPosted : 1; 
    } appTaskFlags = 
     { 
     .appSubTaskPosted = false, 
     .appCmdHandlerTaskPosted = false, 
     .appMsgSenderTaskPosted = false 
     }; 
+0

'false'必須是宏擴展,因爲'C'沒有'bool'類型。 ':1'意味着'uint8_t'內只有1位將被使用(在這種情況下,無論是真還是假,類似於0或1)。其餘的只是結構的初始化。 –

+3

@hhachem C確實有bool類型。它是在14年前的語言中引入的。 – Lundin

+0

@Lundin很高興知道。在使用布爾值時,我總是使用宏。C –

回答

5

它們是位域,在這種情況下它們有1位。它們只能有0或1的值,對或錯。他們的記憶力比單獨的bool少。

您還可以定義大於1的位域。例如,位域2可以具有值0,1,2和3.位域的美妙之處在於您不需要偏移量來訪問它們,而您如果您使用更大的數據類型的個別位,則必須執行此操作。

如果要定義與位域的結構,定義它們緊挨着對方,因爲這樣實際上位域共享一個較大的數據類型,如int 32

+1

位字段共享的數據類型是用於聲明它們的數據類型。我不記得這是由標準規定還是隻是通用的實施規範。 – Potatoswatter

5

你還沒有在你的問題準確地指定你不明白的是什麼,但在你的例子中,至少有四件事情可能在「經典」C文獻中找不到,或者從結構中的一般搜索中找不到。它們是:

  • 位域成員
  • 指定的初始值
  • 顯式寬度的數據類型
  • 布爾文字常數

位域一直在ISO/ANSI C,但並不常用。雖然它們可以導致內存高效的數據結構,但是在大多數體系結構中,它們會生成更多的代碼來訪問,並且訪問可能不是原子性的,這是數據在中斷或線程上下文之間共享時的問題。此外,位字段的打包是實現定義的,因此可能導致在確切的位位置是關鍵的應用中(例如當覆蓋硬件寄存器時)的非便攜式代碼。

Designated initializers在ISO C99中引入。 C99沒有特定的文獻資料,大多數C文獻都會對它進行預約,或者爲了兼容性而堅持使用C90子集。如果你想查找信息就是這樣的話,你應該專門搜索C99。

顯式寬度的數據類型(uint8_t在這種情況下),也被引入與C99但簡單地實現的內置在標準頭stdint.h類型,因此可以在C90被實現編譯器也爲typedef別名。

類似地,在C99中引入了布爾文字truefalse以及bool數據類型。在C99中booltypedef別名,中定義的_Bool以及truefalse的定義。如果您選擇了,您可以在C90中定義booltruefalse,但它缺少內置的_Bool數據類型,因此您可以使用別名整數類型。

+0

我想我應該提到,你指出的那些條款是我在找的。我在和平noe。謝謝你兄弟。 – DarshanJoshi