代码之家  ›  专栏  ›  技术社区  ›  josh

isupper在C中的宏定义是什么?

  •  3
  • josh  · 技术社区  · 14 年前

    4 回复  |  直到 14 年前
        1
  •  13
  •   James Curran    14 年前

    它是由实现定义的——每个供应商都可以,而且通常都是这样做的。

    最常见的通常是一个“traits”表—一个数组,每个字符有一个元素,该元素的值是一组标志,表示字符的详细信息。例如:

     traits[(int) 'C'] = ALPHA | UPPER | PRINTABLE;
    

     #define isupper(c) ((traits[(int)(c)] & UPPER) == UPPER)
    
        2
  •  5
  •   R.. GitHub STOP HELPING ICE    14 年前

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

    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
  •  4
  •   In silico    14 年前

    这是一个函数,不是宏。函数定义 isupper()

    对于ASCII,由于字母的分配方式,实际上很容易进行测试。如果字符的ASCII码介于 0x41 0x5A 包含在内,则为大写字母。

        4
  •  1
  •   Scott S. McCoy    14 年前

    http://ideone.com/GlN05

    GCC专门检查当前区域设置字符中的位0是否为1:

    (*\uu ctype\u b\u loc())[(int)(c)]&(无符号短整型)(1<<(0))