c在struct中使用enum

时间:2018-01-12 12:19:49

标签: c struct enums

您好我想在enum中创建c和结构,但我需要将enum放在另一个struct内(以避免重复名称)。像这样的东西:

#include <stdio.h>

// define structure as our enum namespace
typedef struct {
    typedef enum {
        Host,
        Cookie,
        Agent
    } Name;
} header_n;

typedef struct {
    header_n::Name key; // using top enum
    char value[128];
} header_t;

int main() {

    header_t header;
    header.key = header_n::Agent;

    return 0;
}

实际上我想对struct使用enum,然后在另一个结构中将enum用作分隔类型,然后将最后一个结构作为完整类型调用,但是我得到了这个错误 但我得到错误

error: expected specifier-qualifier-list before 'typedef'
     typedef enum {

error: expected expression before ':' token
     header_n::Name key; // using top enum

error: bit-field '<anonymous>' width not an integer constant
     header_n::Name key; // using top enum

error: bit-field '<anonymous>' has invalid type

error: 'header_t {aka struct <anonymous>}' has no member named 'key'
     header.key = header_n::Agent;

error: expected expression before 'header_n'
     header.key = header_n::Agent;

2 个答案:

答案 0 :(得分:3)

这根本不可能。 C语言不支持它。 C要求您在全局空间中执行所有类型声明。

所以你只需为他们选择不同的名字。您可以通过以某种方式命名类型来完成C ++中的命名空间功能来完成基本相同的操作。像这样:

typedef enum {
...
} foo_name;

typedef struct {
    foo_name name;
} foo;

typedef enum {
...
} bar_name;

typedef struct {
    bar_name name;
} bar;

typedef struct {
    bar_name name;
    foo_name name;
} foobar;

答案 1 :(得分:2)

有几件事:

    C中的
  1. struct只不过是数据集合 - 它们没有&#34;智能&#34;给他们。
  2. 您无法在typedef定义中使用struct;
  3. C中的struct定义不会创建新的命名空间;
  4. C提供4个命名空间 - 一个用于structunionenum标记,一个用于structunion成员,一个用于语句标签,一个用于所有其他标识符(变量名,函数名,typedef名,枚举常量等)。没有用户定义的命名空间,C中没有::范围操作符。
  5. 您必须与struct类型分开定义枚举类型:

    typedef enum { Host, Cookie, Agent } Name;
    
    typedef struct {
      Name key;
      char value[128]
    } header_t;
    

    ,在enum定义中使用非typedef&#39; d struct

    typedef struct
    {
      enum key_t { Host, Cookie, Agent } key;
      char value[128];
    } header_t;
    
    int main( void )
    {
      header_t header;
      header.key = Agent;
      ...
    }
    

    即使我们在header_t类型中定义了类型,enum key_t也可以在其外部使用; C并没有将key_t标记的使用限制为只是 header_t(同样,struct定义不会创建新的命名空间)。所以可以这样做:

    typedef struct
    {
      enum key_t { Host, Cookie, Agent } key;
      char value[128];
    } header_t;
    
    int main( void )
    {
      header_t header;
      header.key = Agent;
      enum key_t some_other_key = Cookie;
      ...
    }
    

    您可以不使用key_t代码:

    typedef struct
    {
      enum { Host, Cookie, Agent } key;
      char value[128];
    } header_t;
    

    因此您无法在struct之外定义该枚举类型的新实例,但您仍然可以使用枚举常量HostCookie和{{ 1}}在此定义之后并将它们分配给整数对象:

    Agent

    由于枚举常量共享&#34;所有其他标识符&#34;命名空间,没有两个int keyval = Host; 类型可以在它们之间使用相同的枚举常量;你不能做像

    这样的事情
    enum

    编译器会抱怨第二个typedef enum { foo, bar, bletch } EnumType1; typedef enum { bletch, foo, bar } EnumType2; 定义中的bletchfoobar中的每一个都已定义。如果要在两种不同的枚举类型之间使用相同的名称,则必须为它们创建唯一的前缀或后缀:

    enum