C标准使用以下语言定义EOF
和WEOF
:
7.21.1输入/输出 - 简介
标题
<stdio.h>
定义了几个宏,并声明了三种类型和许多用于执行输入和输出的函数。...
EOF
扩展为整数常量表达式,类型为int和负值,由多个函数返回以指示文件结束,即不再有来自流的输入;
...
7.21.1扩展的多字节和宽字符实用程序 - 简介:
标题
<wchar.h>
定义了四个宏,并声明了四种数据类型,一个标记和许多函数。...
wint_t
这是一个整数类型,默认情况下,参数提升不变,可以保存与扩展字符集成员对应的任何值,以及至少一个与扩展字符集的任何成员不对应的值
WEOF
扩展为类型为wint_t的常量表达式,其值不对应于扩展字符集的任何成员。(328)本子条款中的若干函数接受(并返回)它以指示文件结束,也就是说,不再有来自流的输入。它也用作宽字符值,与扩展字符集的任何成员都不对应。
328)宏观WEOF的值可能与EOF的值不同,不必为负值。
EOF
是一个负值,它是getc()
可以返回的唯一负值。我看到它通常定义为(-1)
,类似WEOF
定义为((wint_t)-1)
。
是否有任何常见的C环境,其中任何一个宏被定义为不同的东西?
标准委员会为WEOF
留下不同价值的可能性,特别是非负价值的理由是什么?
答案 0 :(得分:3)
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。
答案 1 :(得分:2)
标准委员会有什么理由可以为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。
答案 2 :(得分:0)
在Xinu OS EOF
is defined as -2
中。参见Actual implementation of EOF different from -1
OTOH dataDir=/zookeeper-3.5.7/data_snapshots
dataLogDir=/zookeeper-3.5.7/data_transac_log
# the port at which the clients will connect
clientPort=xxxx
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
tickTime=6000
initLimit=30
syncLimit=12
#set hex value for 4GB i.e. 100000000.
jute.maxbuffer=100000000
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
cnxTimeout=15
server.1=pr3-alloyp-lapp301.prz.apple.com:aaaa:bbbb
server.2=pr3-alloyp-lapp302.prz.apple.com:aaaa:bbbb
server.3=pr3-alloyp-lapp303.prz.apple.com:aaaa:bbbb
quorum.auth.enableSasl=true
quorum.auth.learnerRequireSasl=true
quorum.auth.serverRequireSasl=true
quorum.auth.learner.loginContext=QuorumLearner
quorum.auth.server.loginContext=QuorumServer
quorum.cnxn.threads.size=20
requireClientAuthScheme=sasl
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
可以是无符号类型,因此有许多wint_t
的实际实现。例如,在MSVC中,WEOF != -1
是wint_t
,而unsigned short
是WEOF
。从技术上讲,U+FFFF isn't a valid Unicode character可以用于WEOF,就像(wint_t)(0xFFFF)
在实现中-1
中用于EOF
一样。另请参见