因此,出于好奇,EOF如何定义命名空间? 为什么不 :: EOF 或 std :: EOF ?
#include <cstdio>
while (std::scanf("%s", someStr) != ::EOF); // nope
while (std::scanf("%s", someStr) != std::EOF); // nope
while (std::scanf("%s", someStr) != EOF); // here we go
答案 0 :(得分:3)
EOF
是<cstdio>
中定义的预处理器宏(在C头<stdio.h>
中也可以从C ++中使用)。
在实际编译代码之前,预处理器宏对源代码执行文本替换。因此,预处理器宏不是可以出现在任何名称空间中的名称。
这与标题中声明的函数名称不同,后者可以出现在名称空间中。
答案 1 :(得分:2)
在C中,使用#define
将EOF定义为宏。它可能被定义为const
,除了它早于const
。
为了兼容性,这意味着它也被定义为C ++中的宏。类似的东西:
#define EOF -1
如果您知道#define
的工作原理,您应该看到::EOF
和std::EOF
产生编译错误的原因。 #define
'd宏是简单的文字替换,因此::EOF
扩展为::-1
,std::EOF
扩展为std::-1
,这两者都无效。