2013-12-19 52 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