C关键字由C编译器预定义,它们在C89中是小写的。由于只有32,为什么不能将它们定义为不区分大小写?
答案 0 :(得分:4)
因为C区分大小写,那些是关键字。使它们不区分大小写会使编译器变慢,但真正的原因是它的定义方式。
在60年代,有很多关于信件案例的实验。有一段时间,BCPL reserved lowercase words as system keywords要区分用户名,必须是大写或单字母小写。但后来他们切换到大写(后来又回到了小写)和whether it was case sensitive depended on the compiler。 FORTRAN / Fortran也是如此,它通常不区分大小写,但sometimes is in wildly complicated ways。
因此,当我说“它会使编译器变慢”时,我并不是说“因为它是一种较旧的语言,处理器时间更加珍贵。”大多数现代语言都区分大小写。许多较旧的语言在其历史和实现方面具有不同的区分大小写。但从根本上说,案例敏感性对于计算机来说更简单。这是Unix的大部分设计,C(最初是B)是built to be the system language for Unix。但同样,这只是一个particular design decision in Unix,而不是一些“必须这样”的深刻选择。
但所有这些只是在谈论并回到正确的答案。答案是:因为这就是C的定义方式。
答案 1 :(得分:0)
你可以:
#include <ctype.h>
#include <string.h>
#include <stdio.h>
char const * const kw[]={
"_Alignas",
"_Alignof",
"_Atomic",
"auto",
"_Bool",
"break",
"case",
"char",
"_Complex",
"const",
"continue",
"default",
"do",
"double",
"else",
"enum",
"extern",
"float",
"for",
"_Generic",
"goto",
"if",
"_Imaginary",
"inline",
"int",
"long",
"_Noreturn",
"register",
"restrict",
"return",
"short",
"signed",
"sizeof",
"static",
"_Static_assert",
"struct",
"switch",
"_Thread_local",
"typedef",
"union",
"unsigned",
"void",
"volatile",
"while",
};
static int comb(char * s, int ix, char const * orig){
if(s[ix]==0){
if(0!=strcmp(s,orig))
return -(0>printf("#define %s %s\n", s, orig));
return 0;
}
s[ix]=tolower(s[ix]);
if(0>comb(s,ix+1,orig))
return -1;
s[ix]=toupper(s[ix]);
if(0>comb(s,ix+1,orig))
return -1;
return 0;
}
static int mk_defines(char const* s){
char b[20];
int len = strlen(s);
memcpy(b,s,len+1);
if(0>comb(b,0,s))
return -1;
return 0;
}
int main()
{
int n = sizeof(kw)/sizeof(kw[0]);
for(int i=0;i<n;i++){
if(0>mk_defines(kw[i]))
return -1;
}
return 0;
}
它只有 29,694 定义(是啊!)。