使用枚举常量时出现C错误

时间:2012-03-19 09:28:51

标签: c enums hex decimal

我想写一个函数,它将接受一个表示十六进制数字的字符串并将其转换为整数,我想将十六进制数字放在枚举中,但是当我使用枚举中的一个元素时,我得到一个错误在编译时。

以下是代码:

#include <stdio.h>

int htoi (char h[]);
enum HexDigits {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F};

int main () {
    enum HexDigits h = 9;

    return 0;
}

int htoi (char h[]) {

}

这是我得到的错误:

  

C:\ Users \ KiKo-SaMa \ Desktop \ C&gt; gcc hello.c -o hello

     

hello.c:4:17:错误:数字常量之前的预期标识符

我正在做的事情可能是什么问题?

5 个答案:

答案 0 :(得分:4)

枚举的作用是将符号名称分配给本质上是一个整数,默认情况下从索引0开始。例如;

enum BoolValue { FALSE, UNKNOWN, TRUE };

基本上做了接近的事情;

const int FALSE   = 0;
const int UNKNOWN = 1;
const int TRUE    = 2;

你的问题是你试图将数字放在你的枚举而不是符号名称中,如果你把它重写为实际上它会产生错误是有道理的;

const int 0 = 0;
const int 1 = 1;

...等。

我不确定枚举是否是您要解决的问题的解决方案。

答案 1 :(得分:4)

使用这样的枚举定义是不正确的,它应该是这样的

enum Hex
    {       
        ZERO = 0,
        ONE = 1,
        A = 10,
        B = 11,
    };

如果您的问题是将字符串转换为int,请使用atoi

答案 2 :(得分:3)

必须命名枚举成员,并且不允许他们的姓名(与任何其他名称一样)以数字开头。如果你想使用数字,你必须在前面添加一些东西,例如字母或下划线(例如H0_0)。

另外,作为一个额外的建议,只需将有效字符添加到字符串中然后使用strchr()进行转换就容易多了:

const char *hexchars = "0123456789ABCDEF";

// this takes a single hex character and returns its decimal representation (or -1 in case of an invalid character)
int hex_to_dec(char h) { return strchr(hexchars, h) ? strchr(hexchars, h) - hexchars : -1; }

另请注意,您也可以使用数字常量的十六进制表示形式:0x00x1,... 0xF

答案 3 :(得分:2)

使用strtol()转换任意数字的字符串2-36。

strtol(const char *nptr, char **endptr, int base)

基数0是一种特殊情况,它接受基数为16的“0x”前缀,8为“0”前缀,10为无前缀。

char a[5]="0x0a";
char b[3]="0b";
printf ("%li\n",strtol(a,NULL,0));
printf ("%li\n",strtol(b,NULL,16));

有关错误检查的更长示例,请参阅man page

答案 4 :(得分:1)

enum HexDigits h = 9; // assigning numerical 9 or enum variable

在这种情况下,9可以作为数字9和枚举HexDigits中的'9'。

枚举定义中使用的变量应遵循语言的变量命名约定。仅允许有效的变量名称。

但你为什么要定义枚举? c ++本身不支持十六进制数字吗?

MSDN page

查看enum