c中的静态枚举用法

时间:2014-12-17 04:51:44

标签: c

我在c中搜索了enums上的静态用法,然后我在这里发布了这个主题。我是测试人员,我需要通过编写一个简单的程序来测试本地,静态,全局范围的 enum数据类型

可以轻松测试一个简单的静态变量,类似我需要测试静态枚举数据类型。

我写了一个简单的代码。需要你的帮助。

#include<stdio.h>

enum day {sun=1,mon,tue,wed,thur,fri,sat};
static enum direction {UP,DOWN,RIGHT,LEFT};

int static_enum()
{
    static enum direction dir = UP;
    printf("dir = %d\n",dir);
    dir++;
}


int main()
{
    printf("\nsun = %d mon = %d tue = %d wed = %d thurs = %d fri = %d sat = %d\n",sun,mon,tue,wed,thur,fri,sat);
    enum day fri = 25;
    // now friday gets modified from 21 to 25 becasue we have re-assigned the value
    printf("\nfri = %d\n",fri);
    // now saturday will still have value 22
    printf("\nsat = %d\n",sat);
    printf("\n"); 
    static_enum();
    static_enum();
        return 0;
}

如果代码测试枚举数据类型的静态功能,请告诉我。 谢谢

注意:我搜索过的主题让我认识C#或java。

1 个答案:

答案 0 :(得分:4)

static 存储类与对象的链接和存储相关。它与对象的类型没有任何关系。

下面解释了(我认为)你的程序在做什么:


enum day {sun=1,mon,tue,wed,thur,fri,sat};

这声明了一个带有标记名day的枚举类型,并且还定义了许多枚举常量及其值。

static enum direction {UP,DOWN,RIGHT,LEFT};

这声明了一个带有标记名directions的枚举类型,并且还定义了许多枚举常量及其值。

static 存储类在这里没有意义,因为您没有为对象定义(分配存储)。

int static_enum()
{
    static enum direction dir = UP;
    printf("dir = %d\n",dir);
    dir++;
}

这定义了一个名为dir的块范围对象,其类型为enum directionstatic 存储类意味着将在程序启动时分配和初始化对象,并且它将在函数调用之间保留其最后存储的值。

int main()
{
    printf("\nsun = %d mon = %d tue = %d wed = %d thurs = %d fri = %d sat = %d\n",sun,mon,tue,wed,thur,fri,sat);

这将输出枚举常量的值。

enum day fri = 25;

这定义了一个名为fri的块范围对象,类型enum day,用值25初始化。在此块中,名为fri的枚举常量将不再可见(除非您重新声明enum day)。

// now friday gets modified from 21 to 25 becasue we have re-assigned the value
printf("\nfri = %d\n",fri);

这会输出对象 fri的值, 枚举常量 fri的值。什么都没有被修改。

// now saturday will still have value 22
printf("\nsat = %d\n",sat);

这将按预期输出枚举常量sat的值。

printf("\n"); 
static_enum();
static_enum();
    return 0;
}

有人可能想知道为什么该语言允许{(1}} 存储类在未定义(分配存储)对象的声明中。我认为由于声明和定义共享相同语法的方式,这只是一种语法上的便利。 C语法允许您堆积任意数量的存储类类型说明符类型限定符函数说明符< / em>和 alignment-specifier 以声明中的任何顺序排列。但是,根据C标准的各种语义部分,许多组合是不允许的或导致未定义的行为。我不认为static的声明中有任何禁止无意义static关键字的内容。