Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 的存储大小未知:枚举_C_Enums - Fatal编程技术网

C 的存储大小未知:枚举

C 的存储大小未知:枚举,c,enums,C,Enums,我在file1.h中定义了一个枚举。我想将此枚举作为另一个文件file2.h中的参数引用,但不包括file1.h。现在我必须从file3.h调用get_color函数。我收到两种不同类型的错误: 从不兼容的指针类型[-Werror]传递'get_color'的参数1 错误1已解决,但我得到一个不同的错误:col的存储大小未知。 唯一的问题是我不能在file2.h中包含file1.h。请建议我如何解决这个问题 文件1.h typedef enum { RED, BLUE,

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

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

文件1.h

typedef enum {
    RED,
    BLUE,
    GREEN2,
} colors_t;
文件2.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.

}
get_颜色的签名应为

void get_color(colors_t *col);
类型为“颜色”。不枚举颜色;没有这样的类型

我相信问题在于理解typedef是如何工作的。typedef为类型创建名称

typedef <type> <alias>;
对于结构和枚举,很容易混淆

typedef enum {
    RED,
    BLUE,
    GREEN2,
} colors_t;
类型为enum{RED,BLUE,GREEN2}。别名为colors\u t

在这种情况下,类型没有其他名称;这是一个匿名枚举,只能由颜色引用

你可以给它起个名字

typedef enum colors {
    RED,
    BLUE,
    GREEN2,
} colors_t;
现在,同一类型可以称为枚举颜色或颜色

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

获取颜色的签名应该是

void get_color(colors_t *col);
类型为“颜色”。不枚举颜色;没有这样的类型

我相信问题在于理解typedef是如何工作的。typedef为类型创建名称

typedef <type> <alias>;
对于结构和枚举,很容易混淆

typedef enum {
    RED,
    BLUE,
    GREEN2,
} colors_t;
类型为enum{RED,BLUE,GREEN2}。别名为colors\u t

在这种情况下,类型没有其他名称;这是一个匿名枚举,只能由颜色引用

你可以给它起个名字

typedef enum colors {
    RED,
    BLUE,
    GREEN2,
} colors_t;
现在,同一类型可以称为枚举颜色或颜色


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

只需将代码更改为:

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;
}

只需将代码更改为:

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;
}

我可能错了,但typedef不是这样工作的。成为类型的是颜色,而不是枚举颜色。和structs一样,注意应该是file3.c或main.c,而不是file3.h。如果文件中有函数定义,则它可能不是头。如果要同时使用枚举颜色和颜色,请编写:typedef enum colors{RED,BLUE,GREEN2,}colors\t;。否则,选择一个并坚持下去。我可能错了,但typedef不是这样工作的。成为类型的是颜色,而不是枚举颜色。和structs一样,注意应该是file3.c或main.c,而不是file3.h。如果文件中有函数定义,则它可能不是头。如果要同时使用枚举颜色和颜色,请编写:typedef enum colors{RED,BLUE,GREEN2,}colors\t;。否则,选择一个并坚持下去。