flushall()和_flushall()之间的差异

时间:2012-10-26 17:36:01

标签: c

当我输入flushall();

时,编译器(Visual C ++)总是纠正我
  

警告C4996:'flushall':不推荐使用此项目的POSIX名称。而是使用符合ISO C ++标准的名称:_flushall。

他们都为我工作,有什么不同吗?

2 个答案:

答案 0 :(得分:9)

这个警告是荒谬的; flushall不是POSIX,据我所知,从来没有。冲洗所有打开的stdio流的正确ISO C方式是fflush(NULL);

为了更多地了解这个问题,我相信这是Visual C用于不属于C标准的函数的通用警告消息,但是它们的标准库具有一定程度的兼容性。这些函数中的大多数都是openread之类的东西,并且以相同的名称以某种模糊的方式对应于POSIX函数,并且可以被认为是stdio下面的低级原语等。有些像flushall,实际上不是来自POSIX,而是基于从各种传统统一中复制的古怪函数。

由于这些函数实际上不是C(或C ++)标准的一部分,并且C标准(可能还有C ++标准......?)保留了标准中未明确定义或保留的应用程序标识符,在openflushall等标准标题名称中公开是不符合要求的。 POSIX通过使用功能测试宏来解决这个问题,通过该功能,应用程序可以通过实现明确的方式使命令空间得到保证,但是Microsoft采用了一种方法来弃用类似POSIX的名称并提供替代方法函数,以下划线为前缀,这使它们成为为实现保留的命名空间的一部分。警告建议您使用这些特定于Microsoft的名称,以便在打开选项(可能由编译器开关的宏控制)以使标头中的严格命名空间一致性时,您的代码仍然可以编译。

不幸的是,使用带有下划线前缀的名称编写Microsoft推荐的代码使代码完全不可移植。由于这些名称位于为实现保留的名称空间中,因此其他平台可能会对完全不同的函数使用相同的名称,并且由于它们被保留,您将不被允许替换或#define围绕它们将其重新映射到其他功能。

简而言之:我会找到生成此警告的警告标志,然后将其关闭。与FUD一样,这样的标准函数是“不安全”的,你应该使用_s-suffixed函数。但是,如果您需要的唯一功能是fflushall(),只需将其替换为fflush(NULL);,就可以了。

答案 1 :(得分:2)

这可以追溯到1988年末,当时Dave Cutler的团队开始在Windows NT上开发。设计目标是创建一个具有三个不同api层的操作系统,Winapi,OS / 2和POSIX。 POSIX当时非常新,第一个版本也是在1988年发布的。它被包括在内,因为它被列为美国政府标准FIPS 151-2的要求。

当时Unix战争开始变得严肃起来。在竞争实施中有意识的差异非常恶毒。主要战斗人员是开放软件基金会,一个担心Sun日益占据主导地位的行业组织,以及围绕AT& T的Unix国际组织。直到1993年和COSE联盟的成立,现在是Open Group,尘埃还没有解决。

这使得flushall()的确切起源非常难以追踪,那时非常狂野的狂野西部。 Microsoft也在C编译器业务中,因此当然他们发布了构建在POSIX层上运行的程序的工具,包括声明这些函数的头文件。所以肯定是flushall在他们的工具集中出现的时间。我没有副本可以检查,被漏水的屋顶摧毁。

NT Posix和OS / 2 api层从未获得太大的吸引力,显着地被Win32的失控成功所掩盖。随着XP的发布,它们在2001年全部掉线。我认为,这也是他们开始弃用原始Posix函数名称的时候。显然,当操作系统不再支持这些声明时,再也没有多大意义了。 Posix名称相当笨拙,全局命名空间中的短小写名称导致许多事故。

然而,他们从未被完全删除,至今仍记录在案。这就是你收到警告的原因。而不是选择,而是支持标准C库名称,fflush()。