1

当我通过以下方式声明 typedef 时:

typedef struct
{
  uint8 LastState;
  uint8 CurrentState;
  uint8 NextState;
  uint8 TaskEnabled;
  uint8 Counter;
  uint8 Status;
}SM_tstTaskStateStructure; 

我尝试为我尝试通过以下方式创建的数组定义内容:

#define xInitDataTable  \
{IDLE,IDLE,IDLE,YES,TIMED7SEG,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED1,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED2,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED3,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMEBTN,IDLE},   \
{IDLE,IDLE,IDLE,YES,BASETIME,IDLE},   \
{IDLE,IDLE,IDLE,YES,FREQUPDATE,IDLE}

然后将其初始化为结构数组:

static const SM_tstTaskStateStructure   SM__astData[TASKMAX]=
{
    xInitDataTable  
};

这个编译器是特定的吗?富士通 mc 的 Softune 编译器允许我以这种方式初始化结构数组,而 Code Composer Studio 则不允许。如果是这样,是否有任何类似的方法可以做到这一点(如果可能,使用定义)?

** 这些只是数值,没有指针或任何东西。

编辑:没关系,在尝试使用前或后增量时发生在所有成员身上

4

1 回答 1

2

只要TASKMAX大于 7,这个初始化是完全标准的。

C11 (n1570),第 6.7.9 节初始化

initializer:
    assignment-expression
    { initializer-list }
    { initializer-list , }

如果在增加值时打印错误,那是因为SM__astData使用const限定符声明。

C11 (n1570), § 6.5.3.1 前缀递增和递减运算符

前缀递增或递减运算符的操作数应具有原子、合格或不合格的实数或指针类型,并且应是可修改的左值。

如果要执行此类操作,请使用以下声明:

static /* const */ SM_tstTaskStateStructure   SM__astData[TASKMAX]=
{
    xInitDataTable  
};
于 2013-03-16T16:07:35.810 回答