【发布时间】:2018-08-14 08:16:48
【问题描述】:
我使用 Dev C++ 和 SPC5 Studio 编译了一个 C 代码,它的结构包含指向另一个结构的指针数组。
typedef struct
{
uint16 Identifier_u16;
void* const DataFncType;
}ClassCfg_ts;
typedef struct
{
uint32 Val_u32;
ClassCfg_ts* ClassRef_pu[2];
}atrb_paramCfg_ts;
初始化如下所示
ClassCfg_ts ClassCfg1_s[] = {
{0,writeFucntion},//read write fucntion
{1,writeFucntion},//read write fucntion
{2,writeFucntion},//read write fucntion
};
ClassCfg_ts ClassCfg2_s[] = {
{0,writeFucntion},//read write fucntion
{1,writeFucntion},//read write fucntion
{2,writeFucntion},//read write fucntion
};
atrb_paramCfg_ts atrb_paramCfg_s[] =
{
{0,ClassCfg1_s},
{0,ClassCfg2_s},
};
在哪里定义了 writeFunciton。当使用 Dev C++ 时,此初始化工作完美,而在 SPC5 工作室中会发出警告以包含花括号,并且仅当初始化更改为时才会消失
atrb_paramCfg_ts atrb_paramCfg_s[] =
{
{0,{ClassCfg1_s}},
{0,{ClassCfg2_s}},
};
其中哪个是正确的初始化?
【问题讨论】:
-
你知道
void* const不能用来表示函数指针,是吗? -
它对我有用,我在调用它之前对使用的函数指针类型进行了转换。然而,这不是这里的问题,为了更好的标准,我对函数指针进行了不同的 typedef。
-
只是指出从
void*转换为函数指针会产生未定义的行为,并且可能会在某些系统上导致奇怪的错误。代替void*,使用uintptr_t。 -
@Lundin
uintptr_t对于函数指针同样不够用。回复:C11 7.20.1.4 -
"其中哪个是正确的初始化?" --> 无。
void *未指定足够的宽度来正确存储函数指针。而是存储在一些函数指针中,根据需要在函数指针类型之间进行转换。 C11 §6.3.2.3 8
标签: c pointers data-structures