我对有关堆栈溢出的其他问题有疑问: - segmentation fault on c K&R fopen and fillbuf。在这个问题中,讨论了struct _iobuf中的标志。这些用作不同的访问模式。但是在这里枚举标志中有一些特定的标志值。所以将会标记'只取这些特定值或这些是一些标准值,而flag也可以采取其他一些值?我怀疑的是,在定义数组_iob时,只给出了三个标准值(对于stdin,stdout,stderr)(20个中),因此fp也可以采用其他一些值(同时另外17个) 。第二个疑问是,如果flag只能取(_READ,_WRITE等)定义的值,那么在int _fillbuf()函数中代替写入
if((fp->flag & (_READ|_EOF|_ERR))!=_READ)
我们可以写为
if((fp->flag==_WRITE || fp->flag== _UNBUF))
因为在给定的固定标志值之外,它仍然有意义。
答案 0 :(得分:1)
枚举值是标志位,flag
成员可以设置其中几个。 (并非所有组合都有意义,但很多组合; __READ
,__EOF
和__ERR
标志彼此独立,并且所有八种组合都是可能的。)。
因此
if((fp->flag & (_READ|_EOF|_ERR))!=_READ)
测试文件是否已打开以供阅读,并且既没有设置错误也没有设置EOF标志。