我有以下结构
typedef struct
{
char data1[10];
char data2[10];
AnotherStruct stData;
}MyData;
由于某种原因,实现者选择不将stData作为指针,所以我必须忍受它。 我的问题是如何检查stData成员是否为空?因为如果它是空的我需要跳过我的代码中的某些东西。
任何帮助表示赞赏
我有以下结构
typedef struct
{
char data1[10];
char data2[10];
AnotherStruct stData;
}MyData;
由于某种原因,实现者选择不将stData作为指针,所以我必须忍受它。 我的问题是如何检查stData成员是否为空?因为如果它是空的我需要跳过我的代码中的某些东西。
任何帮助表示赞赏
你需要一些方法来标记 AnotherStruct stData
空。
首先检查(或仔细检查)与之相关的文档和注释 AnotherStruct
,如果有可能的话,可能会问那些制作它的人,找出是否有正式的方法来做你想做的事。
也许该结构具有指针,如果它是空指针,则结构为空。或者可能有一个整数字段,其中0或-1或某些东西可能意味着为空。甚至是一个布尔字段将其标记为空。
如果没有上述任何一项,也许你可以添加这样一个字段,或者对某些字段进行这样的解释。
如果上面的失败,请添加一个布尔字段 MyData
告诉你是否 stData
是空的。
您还可以解释一些值(例如,空字符串?Full 0xFF byte?) data1
和/或 data2
意思是空的 stData
。
如果你不能修改或重新解释任何一个struct的内容,那么你可以将空和非空项放在不同的容器中(数组,列表,无论你有什么)。如果 MyData
项目是从堆逐个分配,然后这基本上与具有相同 一个免费清单。
上面的变化,如果你有一个空的和非空的项目都混合在一个容器中,那么你可以有另一个容器 指针 或索引到非空项目(或空项目,或任何适合您的需要)。这有一个额外的复杂性,你需要保持两个容器同步,这可能是也可能不是微不足道的。
如果它不是指针,则在创建对象MyData时将分配结构成员的内存。当您定义结构时,使用calloc或memset将它们全部设置为零,然后您可以比较为0
你可以找到一些标志变量。恩。
struct AnotherStruct {
bool valid;
char aother_data1[10];
char aother_data1[10];
//...
};
if (stData.valid==true){
//do something
}
我发现自己和你一样(确实)。我需要打包一个给定的结构,并知道结构中的确切字节数将帮助我序列化结构。但是,某些结构为空,因此序列化无法对齐确切的字节数。
虽然这是3年后,我发现以下解决方案对我有用:
template <typename T> struct is_empty {
struct _checker: public T { uint8_t dummy; };
static bool const value = sizeof(_checker) == sizeof(T);
};
结果可以查询为 is_empty<T>::value
并在编译时可用。
template <typename S>
typedef union {
struct __attribute__((__packed__)) {
ObjId id;
S obj;
} dataStruct;
std::array<uint8_t, (sizeof(dataStruct) - is_empty<S>::value)> byteArray;
} _msg_t;
以下是参考资料:
Struct是用户定义的类型,因为int是内置类型的。
struct x;
int y;
首先尝试回答“如何确定你的int是否为空,或者在首次声明之后没有”
关于解决方案: - 如果你想知道它的初始化是否是这样的话,请以这种方式使用你的结构: -
struct X
{
bool b;
X() : b(false) {}
};
初始化时将其设置为true。
我假设结构定义是某些第三方功能/库的一部分,其中第三方可能是您自己公司内的某个人。
如果实施者选择不做 stData
一个指针,然后有原因。他们会知道如何表达“stData
是空的“,如果它甚至被允许为空。你一定要尝试在文档中查找那些语义或与它们交谈。不要试图将自己的语义添加到具有特定目的和语义的结构中。
所以,如果有 是 表达结构部分的预定义方式是空的,使用这种方式。如果它的用途可能不是空的,那么不要试图使其为空。简而言之,不要以不打算使用的方式使用类/结构。相反,如果您发现自己只有“MyData”所需的部分数据才有意义,那么编写自己的“MyPartialData”结构来处理这种情况并将其转换为“MyData”一旦您拥有所需的一切并准备好与第三方API进行交互。