【问题标题】:storage size of isn't known : enum的存储大小未知:枚举
【发布时间】:2017-04-25 22:49:20
【问题描述】:

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

  1. 从不兼容的指针类型传递“get_color”的参数 1 [-Werror]
  2. 错误 1 ​​已解决,但我得到一个不同的错误:col 的存储大小未知。

唯一的问题是我不能在 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.

}

【问题讨论】:

  • 我可能错了,但这不是 typedef 的工作方式。成为类型的是colors_t,而不是enum colors_t。就像结构一样。
  • 请注意,应该是file3.cmain.c,而不是file3.h。如果文件中有函数定义,它可能不是标题。
  • 如果您想同时使用enum colors_tcolors_t,请写:typedef enum colors_t { RED, BLUE, GREEN2, } colors_t;。否则,选择一个并坚持下去。

标签: c enums


【解决方案1】:

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,您可以在幕后以微妙的方式对其进行更改。

【讨论】:

    【解决方案2】:

    只需将您的代码更改为:

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

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      相关资源
      最近更新 更多