移植代码到linux下的匿名结构体问题

之前在做windows服务器迁移到linux的过程中,出现了一个编译类的问题

代码中定义了如下结构体

struct MsgInfo
{
    union 
    {
      struct
      {
        OBJID idType;
        UINT  unExp;
      };
      struct
      {
        OBJID idType;
        UCHAR ucResult;
      };
    }
}

 

在windows下面安全编译通过,在LINUX的GCC下无法编译通过。

这是因为代码中使用到了匿名结构体,匿名结构体在Windows下可以直接访问,且代码中大量使用了诸如m_pInfo->idType,

而GCC下则认为,这种没有名称的结构体会造成混淆。

关于这个问题,可以看这个讨论串

http://stackoverflow.com/questions/1972003/how-to-compile-c-code-with-anonymous-structs-unions

可以看到是如果说加上一些编译参数是可以保证编译通过的,

而且新的c11和c++11都是允许这种写法的

而我这里为了移植,暂时还是用旧方案,因为gcc版本偏低,给每个结构体加上名字

struct MsgInfo
{
    union 
    {
      struct
      {
        OBJID idType;
        UINT  unExp;
      }expInfo;
      struct
      {
        OBJID idType;
        UCHAR ucResult;
      }learnInfo;
    }
}

这样就行了。

 之后使用m_pInfo->learnInfo.idType就可以访问了

posted @ 2015-01-22 11:23  烤狐  阅读(740)  评论(0编辑  收藏  举报