在C中定义宏将无法正常工作

时间:2010-05-09 12:53:28

标签: c macros

我正在尝试在C中创建一个宏,它可以判断char是否为十六进制数(0-9 a-z A-Z)

#define _hex(x) (((x) >= "0" && (x) <= "9" )||( (x) >= "a" && (x) <= "z") || ((x) >= "A" && (x) <= "Z") ? "true" : "false")

这是我提出的,但它不适合像这样的循环

char a;
     for(a = "a" ; a < "z";a++){
        printf("%s  => %s",a, _hex(a));
     }

它出错了

test.c:8: warning: assignment makes integer from pointer without a cast
test.c:8: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer
test.c:9: warning: comparison between pointer and integer

5 个答案:

答案 0 :(得分:9)

“a”是指向字符串“a”的指针。您想要将char与'a'进行比较。

#define _hex(x) (((x) >= '0' && (x) <= '9' )||( (x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') ? "true" : "false")

但您也可以使用isalnum(x) - 如果字符是数字或字符,则返回true。

isxdigit(x)如果真的应该是十六进制检查。

答案 1 :(得分:2)

然后使用isxdigit()

答案 2 :(得分:1)

您在测试循环中犯了与在宏中一样的错误。

for(a = "a" ; a < "z";a++){

应该是:

for(a = 'a' ; a < 'z'; a++){

当然,明智的解决方案是使用isxdigit()中定义的ctype.h作为宏(如果您感兴趣,可以查看)。

答案 3 :(得分:0)

您还需要更改“for”循环以循环“a”到“z”,而不是“a”到“z”。

答案 4 :(得分:0)

我建议不要将宏用于此类功能。 C99支持内联函数,只需写入

inline char *_hex(char c)
{
   ... write there what you need in readable form ...
}