C ++ EOF命名空间

时间:2015-05-02 05:45:54

标签: c++ c namespaces std eof

因此,出于好奇,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

2 个答案:

答案 0 :(得分:3)

EOF<cstdio>中定义的预处理器宏(在C头<stdio.h>中也可以从C ++中使用)。

在实际编译代码之前,预处理器宏对源代码执行文本替换。因此,预处理器宏不是可以出现在任何名称空间中的名称。

这与标题中声明的函数名称不同,后者可以出现在名称空间中。

答案 1 :(得分:2)

在C中,使用#define将EOF定义为。它可能被定义为const,除了它早于const

为了兼容性,这意味着它也被定义为C ++中的宏。类似的东西:

#define EOF -1

如果您知道#define的工作原理,您应该看到::EOFstd::EOF产生编译错误的原因。 #define'd宏是简单的文字替换,因此::EOF扩展为::-1std::EOF扩展为std::-1,这两者都无效。