确定是否已设置struct中的无符号整数值

时间:2013-03-13 16:42:02

标签: c struct

想象一下你有:

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 */
}

2 个答案:

答案 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