我想知道如何在C / C ++中定义“isupper”宏。能否请您提供相同的信息或指向我可用的资源。我试着查看ctype.h,但无法弄明白。
答案 0 :(得分:12)
它的实现定义 - 每个供应商都可以,而且通常会以不同的方式执行。
最常见的通常是“traits”表 - 每个字符都有一个元素的数组,该元素的值是标志的集合,表示有关字符的详细信息。一个例子是:
traits[(int) 'C'] = ALPHA | UPPER | PRINTABLE;
在这种情况下,isupper()会是这样的:
#define isupper(c) ((traits[(int)(c)] & UPPER) == UPPER)
答案 1 :(得分:5)
这是一个功能,而不是宏。 isupper()
的函数定义根据区域设置和当前字符集等不同而不同 - 这就是为什么有一个专门用于此目的的函数。
对于ASCII,由于字母的分配方式,实际上很容易测试。如果角色的ASCII码介于0x41
和0x5A
之间,则为大写字母。
答案 2 :(得分:5)
这是特定于实现的。实现它的一个显而易见的方法是:
extern char *__isupper;
#define isupper(x) ((int)__isupper[(x)])
其中__isupper
指向由区域设置确定的0和1的数组。然而,这种技术已经失宠,因为访问共享库中的全局变量效率很低并且会产生永久的ABI要求,并且因为它与POSIX线程本地语言环境不兼容。
在仅ASCII或仅UTF-8的实现上实现它的另一种显而易见的方法是:
#define isupper(x) ((unsigned)(x)-'A'<='Z'-'A')
答案 3 :(得分:1)
实际上,它在GCC中相当复杂。但isupper的一个简单实现可能是(尽管它有一个双重评估错误),最简单的定义为:
#define isupper(c)(c&gt; ='A')&amp; (c&lt; ='Z')
GCC专门检查当前语言环境的字符中的位0为1:
(* __ ctype_b_loc())[(int)(c)]&amp; (unsigned short int)(1&lt;&lt;(0))
其中__ctype_b_loc()是一个函数,它返回一个指向当前语言环境中包含当前字符集中每个字符特征的字符数组的指针。