String “是什么意思?”;是的,维吉尼亚,最好不要签名;?

String “是什么意思?”;是的,维吉尼亚,最好不要签名;?,string,linux-kernel,comments,cstring,String,Linux Kernel,Comments,Cstring,在linux源代码版本3.18(及更早版本)中,在string.c文件中,在函数strncasecmp中,第一件事是: /* Yes, Virginia, it had better be unsigned */ unsigned char c1, c2; 如图所示: 这是什么意思?调用\uuuu tolower,从中需要非单字符 编辑为添加:通常,您总是希望将无符号字符传递给ctype.h函数,这可能解释了位的含义 更为神秘的是,在这方面,它实际上看起来像是傻瓜式的,因为它在\define\

在linux源代码版本3.18(及更早版本)中,在string.c文件中,在函数strncasecmp中,第一件事是:

/* Yes, Virginia, it had better be unsigned */
unsigned char c1, c2;
如图所示:

这是什么意思?

调用
\uuuu tolower
,从中需要
非单字符

编辑为添加:通常,您总是希望将
无符号字符
传递给ctype.h函数,这可能解释了位的含义

更为神秘的是,在这方面,它实际上看起来像是傻瓜式的,因为它在
\define\u ismask(x)(\u ctype[(int)(unsigned char)(x)]
中有自己的功能。我不确定“Yes,Virginia”注释是何时相对于这另一行添加的,但在当前版本的
include/linux/ctype.h
中,似乎
string.c:strncasecmp()
对于
c1
c2
,即使使用
char
也可以正常工作。我还没有真正尝试改变和测试它的方式虽然


另外,如果您返回到,安全意识演员(
(int)(unsigned char)
)将不再存在。中也没有“Virginia”注释,但其中甚至没有
strncasecmp
。看起来这两个更改都是在Linux 2.0和2.2之间进行的,但我现在无法告诉您更多信息,哪一个先到,等等。

如果您在Linux树中搜索“virginia”,则会有更多“yes,virginia,something”的实例。这可能是指一些老书呆子的东西(书呆子在任何方面都不坏)。维基百科的文章(我在回答中链接了这篇文章)确实提到了“书呆子”这一方面。它引用的社会现象(meme)的一个例子是,它肯定更古老。我认为它指的是定义三种不同类型的C标准:
char
无符号char
,和
有符号char
。在某些体系结构和/或编译器上,它们略有不同。