如何访问C程序中结构中定义的枚举



我是C语言的新手,正在为如何访问结构中的枚举而苦苦挣扎。

我的代码如下:

bankHeader.h文件

struct bankAcct{
int amount;
enum typeOfAcc{chck = 0, saving = 1};
int balance;
}

bank.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;

我复习了一些表格,但没有发现任何容易理解或有效的东西。

如果enumstruct的本地,请使用匿名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 restore monica在下面的评论中指出的那样,chcksaving常数将是"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("%dn", var.type);

附录

首先,出于可读性的原因,我不建议在结构中定义枚举。另一个原因可能是与C++不兼容:我无法编译一个示例C++代码,其中访问了内部enum的符号。以下任务

struct bankAcct var;
var.type = chck;

gpp上引发错误,因为无法在结构定义范围之外引用符号chck。甚至给枚举字段分配一个整数也会导致编译器抱怨,我甚至无法执行转换

b.type = (enum typeOfAcc) 1;

因为引发了一个错误:enum typeOfAcc也无法访问。

但在C中,这些赋值是可以的,枚举标记和常量标识符(命名和匿名(都是";"可达";。如C规范6.2.1§4所述,任何代码块之外的标识符的范围是整个翻译单元:

每个其他标识符的作用域由其声明的位置(在声明符或类型说明符中(决定如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则该标识符具有文件作用域,该文件作用域终止于转换单元的末尾

为了完整性,在说明了范围的结束位置之后,我们必须说明范围的开始位置(C规范6.2.1§7(:

Structure、union和enumeration标记的作用域在声明标记的类型说明符中标记出现之后才开始。每个枚举常量的作用域都在其定义枚举器出现在枚举器列表中之后开始。任何其他标识符的作用域都是在其声明符完成之后才开始的。

您应该在结构外部声明enum类型,然后声明具有该类型的成员变量。

typedef enum {
chck = 0,
saving = 1
} accountType;
struct bankAcct{
int amount;
accountType typeOfAcc   ;
int balance;
}

最新更新