C++ EOF namespace

5
因此,出于好奇,为什么EOF没有定义命名空间呢? 为什么不使用::EOFstd ::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

4
scanf() 和 EOF 是标准 C 库中的函数,它们比 C++ 和 C++ 命名空间都要早。"EOF" 被实现为一个 int 类型的宏定义。 - FoggyDay
3
现在你需要解释为什么 scanf 有一个命名空间。 - Mr Lister
2个回答

3

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

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

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


2
在C语言中,EOF被定义为一个宏,使用了#define。它本来可以被定义为const,但是它的定义早于const。出于兼容性考虑,在C++中它也被定义为宏。类似这样:
#define EOF -1

如果你了解 #define 的工作原理,那么你应该能看出为什么 ::EOFstd::EOF 会产生编译错误。由于 #define 宏是简单的文本替换,所以 ::EOF 会扩展为 ::-1,而 std::EOF 则会扩展为 std::-1,这两者都是无效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接