在这里找到了这个答案: sizeof a struct member
将它完全复制到我的代码中,但我的编译器对象有一个指向不完整类类型的指针。
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
我究竟做错了什么?我想在运行时将 clStructCount 设置为等于 IntelRecsPerPg 的值;我认为这是这样做的诀窍。
谢谢!
在这里找到了这个答案: sizeof a struct member
将它完全复制到我的代码中,但我的编译器对象有一个指向不完整类类型的指针。
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
我究竟做错了什么?我想在运行时将 clStructCount 设置为等于 IntelRecsPerPg 的值;我认为这是这样做的诀窍。
谢谢!
您的结构的定义需要在编译器遇到您的 sizeof 代码时可见。
所以,这个翻译单元应该可以工作:
struct ALMConfStr {
int IntelRecsPerPg[MagicNumber];
};
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
无论是全部在一个文件中,还是结构在代码#include
之前的标头 d 中sizeof
。
然而,这:
struct ALMConfStr;
// ...
uint8_t clStructCount = sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg);
不起作用,因为编译器不知道astruct ALMConfStr
由什么组成,或者在那个上下文中 anIntelRecsPerPg
可能是什么。
我认为没有定义struct ALMConfStr
或者IntelRecsPerPg
不是struct ALMConfStr
说
struct ALMConfStr{
//some member variables
data_type IntelRecsPerPg;
//some more member variables
};
基本上sizeof(((struct ALMConfStr *) 0)->IntelRecsPerPg)
试图得到
sizeof(IntelRecsPerPg)
在结构中,假设结构在地址 0 处可用。
从对无用的回答的评论中:
从我的头文件:
typedef struct ALMConfStruct {
uint8_t updateMode;
uint8_t flashPgSize;
uint8_t flashMaxPagesSize;
uint8_t IntelRecsPerPg;
fptr_t appResetAddr;
uint16_t appEndAddr;
uint8_t comIntf;
}ALMConfStr;
你的struct
标签是ALMConfStruct
和不是ALMConfStr
,所以
struct ALMConfStr
声明一个新的不完整struct
类型。删除struct
, 或struct ALMConfStruct
在您的代码中使用以确定大小。
uint8_t clStructCount = sizeof(((ALMConfStr *) 0)->IntelRecsPerPg);
或者
uint8_t clStructCount = sizeof(((struct ALMConfStruct *) 0)->IntelRecsPerPg);