存储大小未知:枚举

时间:2017-04-25 22:49:20

标签: c enums

我在file1.h中定义了一个枚举。我想将此枚举作为参数在另一个文件file2.h中引用,而不包括file1.h。现在我必须从file3.h调用get_color()函数。我收到两种不同类型的错误:

  1. 从不兼容的指针类型[-Werror]
  2. 传递'get_color'的参数1
  3. 错误1已解决,但我收到了另一个错误:col的存储大小未知。
  4. 唯一的问题是我不能在file2.h中包含file1.h。请建议我如何解决这个问题。

    file1.h

    typedef enum {
        RED,
        BLUE,
        GREEN2,
    } colors_t;
    

    file2.h

    void get_color(enum colors_t *col);
    

    file3.h //选项1

    #include "file1.h"
    #include "file2.h" 
    int main()
    {
         colors_t col;
         get_color(&col); //error: passing argument 1 of 'get_color' from   incompatible pointer type [-Werror]
    
    }
    

    file3.h //选项2

    #include "file1.h"
    #include "file2.h" 
    int main()
    {
         enum colors_t col;
         get_color(&col); //error: storage size of col isn't known.
    
    }
    

2 个答案:

答案 0 :(得分:5)

get_colors的签名应该是......

void get_color(colors_t *col);

类型为colors_t。不是enum colors_t;没有这种类型。

我认为问题在于了解typedef的工作原理。 typedef为类型创建名称。

typedef <type> <alias>;

对于简单类型,这非常简单。这会将unsigned char别名为uint8_t

typedef unsigned char uint8_t;

对于结构和枚举,它很容易混淆。

typedef enum {
    RED,
    BLUE,
    GREEN2,
} colors_t;

类型为enum { RED, BLUE, GREEN2 }。别名是colors_t

在这种情况下,该类型没有其他名称;它是匿名enum,只能由colors_t引用。

你可以给它起一个名字。

typedef enum colors {
    RED,
    BLUE,
    GREEN2,
} colors_t;

现在,相同的类型可以称为enum colorscolors_t

我建议不要这样做,因为它允许人们揭开typedef提供的封装面纱。也就是说,如果每个人都使用colors_t,您可以在幕后以微妙的方式更改它。

答案 1 :(得分:1)

只需将您的代码更改为:

typedef enum {
  RED,
  BLUE,
  GREEN2,
} colors_t;

void get_color(colors_t *col)
{
    /// get_color body  
}

int main(int argc, char **argv)
{
     colors_t col;
     get_color(&col); 

    return 0;
}