c - 将数组作为宏参数传递

标签 c

我使用了这个宏:

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

它给出了这个错误:[错误]“[”可能不会出现在宏参数列表中。 如何在 C 语言中将数组值作为宏的参数?

最佳答案

您的代码中有多个错误,但标题问题的答案是您在宏参数列表中使用普通名称:

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

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

我选择使用c作为“性格”的助记符是风格或个人偏好;使用a一致(大概是“字母”)也可以。

关于c - 将数组作为宏参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44856225/

相关文章:

php - PHP静态变量在内部是如何实现的?

android - 构建独立库

c - 尝试打印字符串时出现段错误

c - avr-gcc 问题 : ignores permanent variable/register binding. 为什么?

c++ - RegLoadKey 给出错误代码 5(拒绝访问)

c - C 语言的 AVL 树迭代器

C 遍历目录并成对打印条目

java - 重建 Android Studio 项目时出现错误

c - 如何修复函数 `_start' : (. text+0x20) 中的错误:对 `main' 的 undefined reference

c - 如何停止C中的预编译?