0

想象一下你有:

我的文件.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;
}

主程序

int main(void)
{
    ...
    /* myStructSetData(pMyStruct, 1, 2, 3); */
    ...
    myStructBuild(pMyStruct);
    ...
}

我提供了 myStructSetData(),但用户可能不一定使用此函数来设置 uData1、2 和 3。在 myStructBuild() 中,我想知道是否设置了 uData1、2 和 3,除非我在创建 pMyStruct 或使用 bIsData1Set 等布尔值时初始化了它们(我想避免)。

那么将uData1、uData2和uData3初始化为-1有意义吗?

因此,在 myStructBuild() 中,我会进行如下检查:

if (pMyStruct->uData1 != -1)
{
    /* Include uData1 when building */
}
4

2 回答 2

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));

即,当将所有值重置为零时,它会使所有值unset

当然,用户必须设置“有效”标志:

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;
};

它的用法与上面相同,但存储大小更小(如果重要的话)

于 2013-03-13T16:52:18.230 回答
0

如果uData变量可以具有任何有效的 unsigned int 值,则否。您不能使用-1,因为它只会存储UINT_MAX在变量中(假设 int 是 32 位)。

If you'll never need to store more than UINT_MAX, and you can change your structure variables type, you could define a larger type if available (e.g. uint64_t), in which case you'd be able to store a value higher than the allowed range (such as -1 converted) to mark as uninitialised. This is the same approach as a file stream returning -1 at EOF, thus requiring an int rather than a char.

于 2013-03-13T16:53:20.303 回答