我使用了这个宏:
#define ISALPHA(text[i]) ('a'<=a && a<= 'z')|| ('A'<=a && a<= 'Z')? ("alpha"):("not alpha")
它会出现此错误:[Error] "[" may not appear in macro parameter list
。
如何在C?
答案 0 :(得分:4)
您的代码中存在多个错误,但标题问题的答案是您在宏参数列表中使用了普通名称:
#define ISALPHA(c) ((('a' <= (c) && (c) <= 'z') || \
('A' <= (c) && (c) <= 'Z')) ? "alpha" : "not alpha")
然后使用以下命令调用数组元素上的宏:
ISALPHA(text[i])
注意在宏中大量使用括号以避免奇数球宏参数出现问题。
比测试更好的方法是使用isalpha()
中的标准(区域设置敏感)<ctype.h>
宏:
#define ISALPHA(c) (isalpha(c) ? "alpha" : "not alpha")
您的版本中的错误包括:
text[i]
代替a
。a
。将字符串括在括号中是不必要的,但不会造成任何麻烦。
我选择使用c
作为&#39;字符&#39;的助记符。是风格或个人偏好;始终使用a
(对于&#39;字母&#39;,可能)也没关系。
答案 1 :(得分:0)
为什么不使用isalpha
中声明的ctype.h
。它比使用宏更安全。不要误会我的意思,宏是很好的工具,前提是你知道自己在做什么,但通常你可能会遇到未定义的行为而你却没有意识到这一点。
我见过这样的事情(在第三方图书馆)
#define min(x,y) ((x)<(y)?(x):(y))
看起来没问题,但事实并非如此。后来当你不想你在做什么时,你可以这样做:
int something(int x, int y)
{
return min(x++, y);
}
扩展为
int something(int x, int y)
{
return ((x++)<(y)?(x++):(y));
}
并产生未定义的行为。