【问题标题】:What do square brackets arround an enum mean? [enum_value] [duplicate]枚举周围的方括号是什么意思? [枚举值] [重复]
【发布时间】:2019-02-08 16:18:48
【问题描述】:

我目前正在研究正确状态机,我发现这篇文章似乎正是我一直在寻找的内容: https://aticleworld.com/state-machine-using-c/ 在理解基于表的状态机的表的过程中,我偶然发现了这段代码,我认为它很难阅读。

所以这是我能做到的:

  • eSystemState 是一个类型定义的枚举,指示当前状态。

  • eSystemEvent 是一个类型定义的枚举,表示当前事件。

  • pfEventHandler 是一个类型定义的函数指针,返回 eSystemState。

  • afEventHandler 是返回 eSystemState 的函数指针类型定义的二维数组(受“last_State”和“last_Event”限制)。

接下来是每种事件类型的一些事件处理程序。 然后是 main 的开始,一些初始化,然后就到了。

之前定义的 afEventHandler 类型被填充了内容,但是其中使用的操作对我来说是一个很大的谜。

我知道每个大括号都会填充一个新的“行”,但是枚举周围的方括号是什么意思,为什么显然可以为由此产生的任何内容赋值?

我知道枚举本质上是数字,我怀疑它(对我来说)是一种处理数组中特定元素的超级晦涩的方法。

我错了吗?

 // Table to define valid states and event of finite state machine
 static afEventHandler StateMachine = {
 [Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
 [Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
 [Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
 [Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
 [Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler}, 
 };

【问题讨论】:

  • 我的问题与“重复”之间的区别在于我不知道代码的作用,而思路正好相反。和我遇到同样情况的人肯定不会随便搜索“指定初始化器”。
  • 因此,您的问题将继续存在并提供有用的搜索材料,而重复的链接将引导搜索者找到完整的答案。

标签: c enums brackets


【解决方案1】:

此语法适用于指定的初始化程序。它允许您初始化数组的特定元素。

方括号中的值是要初始化的数组元素的索引。在这种情况下,它是一个枚举值,但它可以是任何整数。

【讨论】:

    【解决方案2】:

    方括号标记数组下标。其中的enum 标识符只是普通的表达式,替换为enum 值。

    C 允许您使用显式下标初始化数组,称为 designators。比如这个初始化A[1]为4:

    int A[3] = { [1] = 4 };
    

    (其他元素默认为零。)

    使用二维数组,语法变得更加复杂:

    int B[3][4] =
    {
        [1] = { [3] = 7 }
    };
    

    这会将B[1][3] 初始化为 7。这就是您在引用的代码中看到的语法。然后它使用enum 标识符,如Idle_State,而不是上面显示的示例常量137

    【讨论】:

      【解决方案3】:

      我自己找到了,它是一个“指定初始化器”,它确实指定了哪个元素应由选定的值设置。

      它是在 C99 中引入的,这解释了为什么我不知道它。其他元素被初始化为 0。

      我会把这个问题留给其他可能对此感到疑惑的人。 How to initialize only few elements of an array with some values?

      int a[10][10] = {
      {},
      {[5] = 8}
      };
      

      表示在第二行中,元素 5 将被初始化为 8,其他元素将被初始化为 0。

      【讨论】:

        猜你喜欢
        • 2013-07-27
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 2016-09-16
        • 1970-01-01
        • 2011-06-25
        • 2012-08-31
        相关资源
        最近更新 更多