C EOF名称空间

C++ EOF namespace

本文关键字:空间 EOF      更新时间:2023-10-16

因此,出于好奇心,如何没有定义命名空间?为什么不 :: 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

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

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

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

在C中,EOF使用#define定义为A Macro 。它可能已定义为const,只是它早于const

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

#define EOF -1

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