想象一下你有:
myfile.h
typedef struct _myStruct myStruct;
struct _myStruct
{
uint32_t uData1;
uint32_t uData2;
uint32_t uData3;
/* More data members */
}
void myStructSetData(myStruct * const pMyStruct, const uint32_t uData1, const uint32_t uData2, const uint32_t uData3)
{
if (!pMyStruct)
return
pMyStruct->uData1 = uData1;
pMyStruct->uData2 = uData2;
pMyStruct->uData3 = uData3;
}
的main.c
int main(void)
{
...
/* myStructSetData(pMyStruct, 1, 2, 3); */
...
myStructBuild(pMyStruct);
...
}
我提供myStructSetData()但是用户可能不一定使用此函数来设置uData1,2和3.在myStructBuild()中我想知道是否已经设置了uData1,2和3,我不会能够除非我在创建pMyStruct时初始化它们或使用像bIsData1Set这样的bool值(我想避免)。
将uData1,uData2和uData3初始化为-1是否有意义?
所以在myStructBuild()中我会得到一个支票:
if (pMyStruct->uData1 != -1)
{
/* Include uData1 when building */
}
答案 0 :(得分:2)
您可以在帖子中使用魔术/无效值,例如 -1 ,或者更好地使用特殊标记字段:
struct _my_struct
{
int32_t field1;
int16_t field2;
int64_t field3;
bool field1_valid;
bool field2_valid;
bool field2_valid;
};
这将简化编码,特别是在这样的例子的情况下:
struct _my_struct x;
memset(&x, x, sizeof(x));
即。将所有值重置为零时,会使所有值取消设置。
当然,用户必须设置'valid'标志:
x.field1_valid = 1;
x.field1 = 444;
您稍后可以使用代码检查。
根据您的需求和偏好,有效性字段可以分开或组合成一个位域:
struct _my_struct
{
int32_t field1;
int16_t field2;
int64_t field3;
int field1_valid:1;
int field2_valid:1;
int field2_valid:1;
};
它的用法与上面相同,但存储大小较小(如果重要)
答案 1 :(得分:0)
如果uData
变量可以具有任何有效的unsigned int值,则为no。您不能使用-1
,因为它只会在变量中存储UINT_MAX
(假设int是32位,即)。
如果您永远不需要存储超过UINT_MAX
,并且您可以更改结构变量类型,则可以定义更大的类型(如果可用)(例如uint64_t
),在这种情况下,您可以d能够存储高于允许范围的值(例如转换为-1
)以标记为未初始化。这与在EOF返回-1
的文件流的方法相同,因此需要int
而不是char
。