您好我想在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;
答案 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)
有几件事:
struct
只不过是数据集合 - 它们没有&#34;智能&#34;给他们。 typedef
定义中使用struct
; struct
定义不会创建新的命名空间; struct
,union
和enum
标记,一个用于struct
和union
成员,一个用于语句标签,一个用于所有其他标识符(变量名,函数名,typedef名,枚举常量等)。没有用户定义的命名空间,C中没有::
范围操作符。您必须与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
之外定义该枚举类型的新实例,但您仍然可以使用枚举常量Host
,Cookie
和{{ 1}}在此定义之后并将它们分配给整数对象:
Agent
由于枚举常量共享&#34;所有其他标识符&#34;命名空间,没有两个int keyval = Host;
类型可以在它们之间使用相同的枚举常量;你不能做像
enum
编译器会抱怨第二个typedef enum { foo, bar, bletch } EnumType1;
typedef enum { bletch, foo, bar } EnumType2;
定义中的bletch
,foo
和bar
中的每一个都已定义。如果要在两种不同的枚举类型之间使用相同的名称,则必须为它们创建唯一的前缀或后缀:
enum