C中isupper的宏定义是什么?

jos*_*osh 3 c c++ macros definition

我想知道在C/C++中如何定义"isupper"宏.能否请您提供相同的信息或指向我可用的资源.我试着查看ctype.h,但无法弄明白.

Jam*_*ran 12

它是实现定义的 - 每个供应商都可以,而且通常会以不同的方式执行.

最常见的通常是"traits"表 - 一个数组,每个字符有一个元素,该元素的值是一组标志,表示有关该字符的详细信息.一个例子是:

 traits[(int) 'C'] = ALPHA | UPPER | PRINTABLE;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,isupper()将是这样的:

 #define isupper(c) ((traits[(int)(c)] & UPPER) == UPPER)
Run Code Online (Sandbox Code Playgroud)


In *_*ico 5

这是一个功能,而不是宏.函数定义isupper()根据区域设置和当前字符集等不同而不同 - 这就是为什么有一个专门用于此目的的函数.

对于ASCII,由于字母的分配方式,实际上很容易测试.如果字符的ASCII码落在之间0x410x5A包容性的,那么它是一个大写字母.


R..*_*R.. 5

它是特定于实现的.实现它的一个明显方法是:

extern char *__isupper;
#define isupper(x) ((int)__isupper[(x)])
Run Code Online (Sandbox Code Playgroud)

其中__isupper点0和1的区域设置确定的阵列.然而,这种技术已经失宠,因为访问共享库中的全局变量效率很低并且会产生永久的ABI要求,并且因为它与POSIX线程本地语言环境不兼容.

在仅ASCII或仅UTF-8的实现上实现它的另一种显而易见的方法是:

#define isupper(x) ((unsigned)(x)-'A'<='Z'-'A')
Run Code Online (Sandbox Code Playgroud)