是否存在EOF!= -1或WEOF!= -1的常见C环境

C标准使用以下语言定义EOFWEOF

7.21.1输入/输出 – 简介

头文件定义了几个宏,并声明了三种类型和许多用于执行输入和输出的函数。

EOF

它扩展为一个整数常量表达式,类型为int,负值,由几个函数返回,表示文件结束,即不再有来自流的输入;

7.21.1扩展的多字节和宽字符实用程序 – 简介:

头文件定义了四个宏,并声明了四种数据类型,一个标记和许多函数。

wint_t

这是一个整数类型,默认情况下,参数提升不变,可以保存与扩展字符集成员对应的任何值,以及至少一个与扩展字符集的任何成员不对应的值

WEOF

扩展为类型为wint_t的常量表达式,其值与扩展字符集的任何成员都不对应。(328)本子条款中的若干函数接受(并返回)它以指示文件结束,即,没有来自流的输入。 它还用作宽字符值,与扩展字符集的任何成员都不对应。


328)宏观WEOF的值可能与EOF的值不同,不必为负值。

EOF是一个负值,它是getc()可以返回的唯一负值。 我已经看到它通常定义为(-1) ,同样WEOF定义为((wint_t)-1)

是否有任何常见的C环境,其中这些宏中的任何一个被定义为不同的东西?

标准委员会有什么理由留下不同价值的可能性,特别是对WEOF的非负价值?

标准委员会有什么理由留下不同价值的可能性,特别是对WEOF的非负价值?

int类型始终是有符号的,负值始终包含在范围内,因此EOF宏可以由标准定义为-1。

但是,类型wint_t可以是有符号或无符号1 ,因此宏WEOF不能被标准定义为特定值。 实现必须选择它,因为实现定义了类型wint_t及其签名,所以它还必须为WEOF选择一个值。


1 (引用自:ISO / IEC 9899:201x 7.20.3其他整数类型的限制5)
如果将wint_t(见7.29)定义为有符号整数类型,则WINT_MIN的值不应大于-32767,WINT_MAX的值不应小于32767; 否则,wint_t被定义为无符号整数类型,WINT_MIN的值应为0,WINT_MAX的值应不小于65535。

EOF的值为-1允许简单有效地实现ctype宏(对于小char的常见情况,比如8位左右)。 典型的实现可能如下所示:

 unsigned __ctypes[257] = { 0 /* for EOF */, ... }; #define isalpha(c) (__ctypes[(c)+1] & _ALPHA_BITS) 

将EOF定义为任何其他整数没有特别的好处,因此-1可能用于具有小char类型的任何合理实现中。

对于大型wchar_t ,该表太大,因此wctype函数可能以不同方式实现。 因此,给予WEOF任何特定价值的动力较小,包括-1。