验证结构-如何将字符串传递给sizeof和offset方法
validating structures - how to pass string to sizeof and offset methods?
我的程序包含自动生成的结构。在开始时,我需要用"服务器"信息来验证它们,这样我就可以确保我自动生成的结构是最新的。如果服务器和本地结构具有相同的大小,并且包含具有相同名称和大小的字段(理想情况下还应验证类型),则它们是有效的。
这是我迄今为止写的:
void SchemeValidator::Validate(cg_scheme_desc_t* schemedesc, Logger& logger)
{
struct cg_message_desc_t* msgdesc = schemedesc->messages;
while (msgdesc)
{
struct cg_field_desc_t* fielddesc = msgdesc->fields;
char* structName = msgdesc->name;
size_t structSize = msgdesc->size;
logger.Debug("Message %s, block size = %d", structName, structSize);
if (strcmp(structName, "orders")) {
if (sizeof(orders) != structSize) {
printf("Validator error, structure 'orders', local size = %d server size = %d!", sizeof(orders), structSize);
throw std::exception("Validator error, structure 'orders' wrong size!");
}
while (fielddesc)
{
logger.Debug("tField %s = %s [size=%d, offset=%d]", fielddesc->name, fielddesc->type, fielddesc->size, fielddesc->offset);
if (offsetof(struct orders, fielddesc->name) != fielddesc->offset) {
throw std::exception("orders structure offset wrong");
}
// TODO: validate fielddesc->size == sizeof corresponding field in structure
fielddesc = fielddesc->next;
}
} else {
throw std::exception("Validator error, validation not implemented!");
}
msgdesc = msgdesc->next;
}
}
有很多问题:
我写if (strcmp(structName, "orders"))
是因为后来我需要在几个表达式中使用orders
,包括sizeof(orders)
和offsetof(struct orders, fielddesc->name)
。但我有很多结构,每一个我都必须复制粘贴这个块。我可以以某种方式将字符串文本传递给sizeof
和offsetof
方法吗?或者以其他方式产生所需的效果吗?
offsetof(struct orders, fielddesc->name)
不起作用的原因相同-第二个参数不能是字符串文字,我收到error C2039: 'fielddesc' : is not a member of 'orders'
错误
出于同样的原因,我可以验证fielddesc->size
。
如何在没有密集的复制粘贴和值硬编码的情况下实现所需的验证?
我相信您可以通过用typedefs定义结构并使用模板化函数来实现您想要的。以下内容应取代您的(显然未经测试)
struct OrderType {
typedef cg_field_desc_t* ListItem;
typedef orders Class;
static const std::string Name;
};
std::string OrderType::Name = "orders";
template <class T>
checkStuff(T::ListItem fielddesc, const char* name, size_t structSize)
{
if (strcmp(name, T::Name.c_str())) {
if (sizeof(T::Class) != structSize) {
printf("Validator error, structure 'orders', local size = %d server size = %d!", sizeof(T::Class), structSize);
throw std::exception("Validator error, structure 'orders' wrong size!");
}
while (fielddesc)
{
logger.Debug("tField %s = %s [size=%d, offset=%d]", fielddesc->name, fielddesc->type, fielddesc->size, fielddesc->offset);
if (offsetof(T::Class, fielddesc->name) != fielddesc->offset) {
throw std::exception("orders structure offset wrong");
}
// TODO: validate fielddesc->size == sizeof corresponding field in structure
fielddesc = fielddesc->next;
}
} else {
throw std::exception("Validator error, validation not implemented!");
}
}
然后用替换if语句
checkStuff<OrderType>(fielddesc, name, structSize);
您可以通过定义新的结构将其扩展到其他类型
struct OtherType {
typedef some_other_t* ListItem;
typedef bizbaz Class;
static const std::string Name;
};
std::string OtherType::Name = "foobar";
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 在类作用域内不能将“static_assert”与“sizeof”一起使用(但方法作用域可以)
- 有没有一种方法可以通过sizeof()来计算指向向量的大小
- 为什么 sizeof 运算符在传递给方法的数组上使用时返回错误的值
- 验证结构-如何将字符串传递给sizeof和offset方法
- 包含unordered_map成员的结构体的Sizeof()方法
- 获得sizeof(提升(x))的标准方法
- 方法中使用的静态模板成员数组sizeof