C++ 验证结构-如何将字符串传递给sizeof和offset方法?

C++ 验证结构-如何将字符串传递给sizeof和offset方法?,c++,C++,我的程序包含自动生成的结构。开始时,我需要用“服务器”信息验证它们,这样我就可以确保自动生成的结构是最新的。如果服务器和本地结构大小相同,并且包含具有相同名称和大小的字段(理想情况下,类型也应经过验证),则它们是有效的 这是我到目前为止写的: void SchemeValidator::Validate(cg_scheme_desc_t* schemedesc, Logger& logger) { struct cg_message_desc_t* msgdesc = schem

我的程序包含自动生成的结构。开始时,我需要用“服务器”信息验证它们,这样我就可以确保自动生成的结构是最新的。如果服务器和本地结构大小相同,并且包含具有相同名称和大小的字段(理想情况下,类型也应经过验证),则它们是有效的

这是我到目前为止写的:

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
offset of
方法,或者以另一种方式达到预期效果

offsetof(struct orders,fielddesc->name)
由于同样的原因无法工作-第二个参数不能是字符串文字,我收到
错误C2039:“fielddesc”:不是“orders”的成员

出于同样的原因,我可以验证
fielddesc->size


如何在不进行密集复制粘贴和值硬编码的情况下实现所需的验证?

我相信,通过使用typedef定义结构并使用模板化函数,您可以实现所需的功能。以下内容应替换您已有的内容(显然未经测试)


它们不是方法,而是编译时运算符。sizeof对类型进行操作,offsetof对类型和成员名称进行操作。您不能将字符串传递给它们中的任何一个。使用Google协议缓冲区或Apache Thrift而不是自制的消息传递协议如何?他们对这类东西有一定程度的支持,我同意@JohnZwinck。您根本不应该用结构或类定义有线协议,所有这些元检查都证明了这一点。对不起,我不控制服务器端,这是证券交易所的工作方式
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!");
   }
}
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";