是否有任何常见的C环境,其中EOF!= -1或WEOF!= -1

时间:2016-11-21 10:08:29

标签: c macros language-lawyer

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

  

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留下不同价值的可能性,特别是非负价值的理由是什么?

3 个答案:

答案 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 != -1wint_t,而unsigned shortWEOF。从技术上讲,U+FFFF isn't a valid Unicode character可以用于WEOF,就像(wint_t)(0xFFFF)在实现中-1中用于EOF一样。另请参见