[英]How to access enum defined within a struct in C program
我是 C 语言的新手,正在努力解决如何访问结构中的枚举。
我的代码如下:
bankHeader.h 文件
struct bankAcct{
int amount;
enum typeOfAcc{chck = 0, saving = 1};
int balance;
}
银行.c文件
#include <stdio.h>
#include "bankHeader.h"
struct bankAcct test;
test.amount=100;
// I want to be able to get the value within my typeOfAcc
// example something like test.typeOfAcct = "chck" should return 0;
我查看了一些表格,但没有看到任何易于理解或工作的内容。
结构声明中的每个字段都采用以下形式
type fieldName;
和
enum typeOfAcc{chck = 0, saving = 1};
您已指定类型...但未指定字段名称。 这就像以这种方式定义结构
struct foo {
int;
}
所以,基本上,你需要的是一个字段名:
struct bankAcct{
int amount;
enum typeOfAcc{chck = 0, saving = 1} type;
int balance;
}
您将能够访问它
struct bankAcct var;
printf("%d\n", var.type);
我不建议在结构内定义枚举,首先是出于可读性原因。 另一个原因可能是与 C++ 不兼容:我无法编译一个示例 C++ 代码,其中访问了内部enum
的符号。 下面的赋值
struct bankAcct var;
var.type = chck;
在gpp上引发错误,因为无法在结构定义范围之外引用符号chck
。 即使为 enum 字段分配一个整数也会导致编译器抱怨,我什至无法执行转换
b.type = (enum typeOfAcc) 1;
因为引发了错误: enum typeOfAcc
也无法访问。
但是在 C 中,这些赋值是可以的,并且枚举标记和常量标识符(命名和匿名)都是“可达的”。 如C 规范 6.2.1§4中所述,任何代码块之外的标识符的范围是整个翻译单元:
每个其他标识符的范围由其声明的位置决定(在声明符或类型说明符中)。 如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件范围,该范围在翻译单元的末尾终止。
为了完整起见,在说完范围在哪里结束之后,我们必须说范围从哪里开始( C 规范 6.2.1§7 ):
结构、联合和枚举标记的作用域在声明标记的类型说明符中的标记出现之后开始。 每个枚举常量的作用域刚好在枚举器列表中其定义的枚举器出现之后开始。 任何其他标识符的范围都在其声明符完成之后开始。
如果enum
是struct
本地的,请使用匿名enum
:
struct bankAcct{
int amount;
enum {chck = 0, saving = 1} type_of_acct;
int balance;
};
您还可以在struct
放置一个标记的enum
:
struct bankAcct{
int amount;
enum typeOfAcc {chck = 0, saving = 1} type_of_acct;
//^this misleadingly puts `enum typeOfAcc` in filescope
int balance;
};
但是将提升枚举(或结构或联合)的标记(而不是匿名)内部定义。 实际上,后一个片段只是一种令人困惑的做法:
enum typeOfAcc {chck = 0, saving = 1};
struct bankAcct{
int amount;
enum typeOfAcc type_of_acct;
int balance;
};
请注意,正如peter- chck
-monica在下面的评论中指出的那样,无论您是否选择使用匿名嵌入式枚举类型, chck
和saving
常量都将被“提升”。
您应该在结构外声明enum
类型,然后声明具有该类型的成员变量。
typedef enum {
chck = 0,
saving = 1
} accountType;
struct bankAcct{
int amount;
accountType typeOfAcc ;
int balance;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.