我在file1.h中定义了一个枚举。我想将此枚举作为参数在另一个文件file2.h中引用,而不包括file1.h。现在我必须从file3.h调用get_color()函数。我收到两种不同类型的错误:
唯一的问题是我不能在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.
}
答案 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 colors
或colors_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;
}