C标准使用以下语言定义了EOF和WEOF:
7.21.1输入/输出-介绍 header
<stdio.h>定义了几个宏,并声明了执行输入和输出的三种类型和多个函数。 ..。EOF它扩展为一个整数常量表达式,带有int类型和一个负值,由几个函数返回,以指示文件结束,即不再从流输入; . 7.21.1扩展的多字节和宽字符实用程序 -导言: header<wchar.h>定义了四个宏,并声明了四种数据类型、一个标记和许多函数。 ..。wint_t它是默认情况下不变的整数类型参数升级,可以保存与扩展字符集成员对应的任何值,以及至少一个与扩展字符集的任何成员不对应的值。WEOF它扩展为wint_t类型的常量表达式,其值不对应于扩展字符集的任何成员。(328)该值由该子子句中的几个函数接受(并返回),以指示文件结束,即不再来自流的输入。它还用作不对应于扩展字符集的任何成员的宽字符值。
EOF是一个负值,它是getc()可以返回的唯一负值。我看到它通常被定义为(-1),类似的WEOF定义为((wint_t)-1)。
是否有任何共同的C环境,其中任何一个宏被定义为不同的东西?
标准委员会保留不同价值的可能性,特别是WEOF的非负价值的理由是什么?
发布于 2016-11-21 11:14:51
EOF的值-1允许简单高效地实现ctype宏(对于小char的常见情况,例如8位左右)。典型的实现可能如下所示:
unsigned __ctypes[257] = { 0 /* for EOF */, ... };
#define isalpha(c) (__ctypes[(c)+1] & _ALPHA_BITS)将EOF定义为任何其他整数并没有什么特别的好处,因此在任何具有小char类型的合理实现中都可能使用so -1。
对于大型wchar_t,表太大,因此wctype函数可能会以不同的方式实现。因此,不鼓励给予WEOF任何特定的价值,包括-1。
发布于 2020-09-03 15:02:15
在Xinu中-2。请参阅Actual implementation of EOF different from -1
OTOH wint_t 可以是一个无符号类型的,因此有许多实际的WEOF != -1实现。例如,在MSVC中,wint_t是unsigned short,WEOF是(wint_t)(0xFFFF)。从技术上讲,U+FFFF isn't a valid Unicode character可以用于WEOF,就像-1在sizeof(char) == sizeof(int)实现中用于EOF一样。另请参阅
https://stackoverflow.com/questions/40717563
复制相似问题