GCC关闭"警告:声明没有声明任何内容"

时间:2018-03-18 18:37:30

标签: c gcc

我可以传递给gcc以禁用此警告吗?我知道它的作用,但对我的程序来说无关紧要。

编辑:我只想禁用警告,保持代码不变。 编译以下代码会生成警告:

struct post{
  unsigned int isImg : 1;
  struct img{
    char *name;
    char *url;
    int likes;
  };

  unsigned int isTxt : 1;
  struct text{
     char*text;
     int likes;
  };
  union Data{
    struct img Img;
    struct text Txt;
  } data;
};

我使用的gcc版本是5.4.0

1 个答案:

答案 0 :(得分:1)

看着:

struct post{
    unsigned int isImg : 1;
    struct img
    {
        char *name;
        char *url;
        int likes;
    };

    unsigned int isTxt : 1;

    struct text
    {
        char*text;
        int likes;
    };

    union Data
    {
        struct img Img;
        struct text Txt;
    } data;
};

我看到一些问题:

  1. 第一个32位位图的定义,只定义了一位
  2. 'img'结构是12字节+ 4字节填充
  3. 第二个32位位图的定义,只定义了一位
  4. 'text'结构是8字节+ 8字节填充
  5. 联合,由两个先前的结构类型组成
  6. 全部使用封闭结构
  7. 定义

    这是非常糟糕的数据声明组织。

    建议:

    struct img  //32bits
    {
        char *name;
        char *url;
        int   likes;
    };
    
    struct text //32bits
    {
         char *text;
         int   likes;
    };
    
    union Data  // 32bits
    {
        struct img  Img;
        struct text Text;
    };
    
    
    struct post //5*32bits
    {
      unsigned int isImg : 1;
      struct img   image;
      unsigned int isTxt : 1;
      struct text  Text;
      union Data   data;
    };
    

    即使使用上述(没有编译错误/警告),仍然存在位图排序是实现定义的问题,因此如果没有测试,您不知道这些定义的位是MSB还是LSB的位图。