2014-10-01 152 views
0
enum denomination 
    { 
     FIVE_CENTS, TEN_CENTS, TWENTY_CENTS, FIFTY_CENTS, ONE_DOLLAR, 
     TWO_DOLLARS, FIVE_DOLLARS, TEN_DOLLARS 
    }; 

    struct DENOM_NAME 
    { 
     char name[MAX_NAME]; 
     enum denomination denom; 
    }; 

    /* Table of names and matching denominations */ 
    static struct DENOM_NAME denomTable[8] = { 
     { "5", FIVE_CENTS }, 
     { "10", TEN_CENTS }, 
     { "20", TWENTY_CENTS }, 
     { "50", FIFTY_CENTS }, 
     { "100", ONE_DOLLAR }, 
     { "200", TWO_DOLLARS }, 
     { "500", FIVE_DOLLARS }, 
     { "1000", TEN_DOLLARS } 
    }; 

我已经知道用值初始化数组是可以的,但不知何故编译器会抱怨混合声明和代码(c90 btw)。我该如何解决?初始化类型结构数组

+1

如何定义'enum denomination'?什么是错误信息? – 2014-10-01 07:47:41

+0

将结构声明中的枚举更改为int或char,并先定义您的枚举。 枚举不会在内存中创建单元,所以它不适用于结构 enum像#define,它给出了一些常量的名称 – 2014-10-01 07:54:43

+0

您在声明之前有一些可执行代码。看看编译器抱怨之前的几行。如果可能的话,升级到C11(甚至只是C99)编译器,或将编译选项升级到C99或(最好)C11。 – 2014-10-01 08:02:44

回答

2

您可以从C89/C90编译器代码得到的错误是这样的:

void function(void) 
{ 
    int i = 23;   /* OK - initialization */ 
    printf("%d\n", i); /* OK - executable statement (code) */ 
    enum denomination /* BAD - declaration mixed with code */ 
    { 
     FIVE_CENTS, TEN_CENTS, TWENTY_CENTS, FIFTY_CENTS, ONE_DOLLAR, 
     TWO_DOLLARS, FIVE_DOLLARS, TEN_DOLLARS 
    }; 
    … 

你可以有一个简单的函数调用,分配,流浪多余的分号,或者说前行,其中错误开始。

请注意,C99和C11遵循C++的领导,并允许(几乎)函数(语句块)中的任何点的变量定义。上面的大纲代码在C99和C11中都很好。

+0

这会做到这一点。 'int denomination = 0;'会好的; 'int面额;面额= 0;'后面的类型定义不正确。 – 2014-10-01 08:14:54

+0

感谢。显然这是我的这一行: INT面额; 面额= 0; 由int denomination = 0固定; – Teddy 2014-10-01 08:15:06