将数组作为宏参数传递

时间:2017-07-01 00:06:39

标签: c

我使用了这个宏:

#define ISALPHA(text[i]) ('a'<=a && a<= 'z')|| ('A'<=a && a<= 'Z')? ("alpha"):("not alpha")

它会出现此错误:[Error] "[" may not appear in macro parameter list。 如何在C?

中的宏中将数组值作为参数

2 个答案:

答案 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
  • 不将整个宏括在括号中。
  • (次要)对于某些代码集,例如IBM大型机上使用的EBCDIC,对字符是否为字母的测试是不准确的。

将字符串括在括号中是不必要的,但不会造成任何麻烦。

我选择使用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));
}

并产生未定义的行为。