C++ 中的“minmax.h”是啥?

Posted

技术标签:

【中文标题】C++ 中的“minmax.h”是啥?【英文标题】:What is "minmax.h" in C++?C++ 中的“minmax.h”是什么? 【发布时间】:2020-10-05 06:19:25 【问题描述】:

我一直在我的脚本中使用#include <minmax.h>,并按预期使用min()max()。我向某人展示了这个,他们以前从未见过它,说它对他们不起作用,并问我为什么不包括 <algorithm> 并打电话给 std::min()std::max()

所以我的问题基本上是,为什么我不是?我在一本关于 C++ 的书中找到了这一点:“C++ Design Patterns and Derivatives Pricing”。谷歌搜索"minmax.h",我在最上面的结果中找到了对那本书的引用,所以更让我觉得这是不正常的。

有人能告诉我这是什么吗?

【问题讨论】:

这可能与 Windows API 标头用于 #define minmax 的事实有关,导致尝试同时使用标准 C++ 和 Windows API 时头疼。 您是否还必须提供该标题?如果是这样,你是从哪里得到的?如果没有,你在哪个平台上? 我找到了this,也许这就是你正在使用的 本书第二版不做#include <minmax.h>。它似乎使用标准的<algorithm> 算法。编辑:是的,但搜索minmax.h 失败。搜索minmax时找到了。 @AsteroidsWithWings 我没有,我只是写了#include 并且它似乎有效,我已经检查了我的代码以确保并且还检查了书中是否提供了一些代码但不,只是#include 部分。我在使用 Visual Studios 的 Windows 上 【参考方案1】:

C++ 编程语言带有C++ Standard Library。 C++ 标准库中没有 <minmax.h> 标头。标准库中没有标题具有 .h 扩展名。此外,标头也不是移植的 C 标准库的一部分,因为这些标头具有 c 前缀,例如 <cmath>(替换 C 标准库 <math.h> 标头)、@987654328 @(替换 <time.h> 标头)从 C++ 标准库中使用时。

std::min 和 std::max 函数在 <algorithm> 标头中声明。

话虽如此,C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt 文件夹内确实似乎有一些名为 <minmax.h> 的 MS 标头,它定义了 minmax 宏,而不是函数。但是,这是一些特定于实现的标头,您应该改用标准的 <algorithm> 标头。

【讨论】:

注意:: C 标准库头文件在从 C++ 访问时只有 c 前缀。【参考方案2】:

为什么不是我?

人们会在某个地方听说过各种奇怪的事情,无论是在学校还是作为某种“解决方案”解决了他们的迫切需求(通常是在时间压力下)。然后他们继续以同样的方式做事,因为他们“工作”。但我很高兴你停下来问一问。希望我们能引导你回到可移植的 C++ 路线:)

不,不需要使用非标准的 minmax.h 标头。在 Windows 上,您需要定义 NOMINMAX之前您包含任何标题,并在此宏定义之后包含 <algorithm>。这只是为了使minmax 符号免于被构思不当的WINAPI 宏所接管。在 C++ 中,std::min 等位于 <algorithm> 标头中,这就是您应该使用的。因此,以下是可移植的:

#define NOMINMAX
#include <algorithm>
// other includes
#undef NOMINMAX

// your code here

有关 Windows 的详细信息,请参阅 this answer。

【讨论】:

【参考方案3】:

一个古老的参考 w.r.t. C++,使用古老的编译器,提供使用非标准 C++ 的示例(例如,minmax.h 等标头)

注意您提到的书,C++ Design Patterns and Derivatives Pricing (MS Joshi),was first released in 2004,随后在 2008 年发布了第二版。从下面的摘录中可以看出,书中的示例依赖于在古老的编译器版本上的成功编译(早在 2004 年就不那么古老了,但距离最近的版本还很远)。

本书的附录 D 甚至特别提到本书涵盖的代码示例可能不符合标准,然后是实用的建议 “[...] 解决问题应该不难” [强调我的]:

代码已在三种编译器下测试:MingW 2.95、Borland 5.5 和 Visual C++ 6.0。其中前两个是免费提供的,因此您应该可以轻松找到代码适用的编译器。此外,MingW 是 GNU 编译器 gcc 的 Windows 端口,因此代码也应该与该编译器一起使用。 Visual C++ 不是免费的,但在城市中很流行,而且入门版本也不是很贵。此外,我努力只使用 ANSI/ISO 代码,因此该代码可以在任何编译器下工作。无论如何,它不使用任何尖端的语言功能所以如果它与您的编译器不兼容,解决问题应该不难。

上面列出的编译器版本非常旧:

Borland 5.5 was released in 2000, Visual C++ 6.0 was released in 1998, GCC 2.95 was released in 1999。

与任何其他古代编译器非常相似,这些编译器提供非标准头文件(例如 minmax.h)并不奇怪,特别是因为它似乎是一种常见的非标准约定,基于例如以下参考资料。

Gnulib Module List - Extra functions based on ANSI C 89:minmax.h,可能在 GCC 2.95 中可访问, Known problems in using the Microsoft Visual C++ compiler, version 6.0:

MS 库没有定义最小和最大算法,应该在我们使用的解决方法是定义一个新的头文件,比如 minmax.h,我们将其包含在任何使用这些函数的文件中:[. ..]

What is the worst real-world macros/pre-processor abuse you've ever come across?:

现实世界? MSVC 在 minmax.h 中有宏,称为 max 和 min,每次我打算使用标准 std::numeric_limits::max() 函数时都会导致编译器错误。

C++ 语言的替代参考

根据上面的段落,这本书很可能主要被视为其主要领域量化金融的参考,而不是 C++,除了后者是用于覆盖前者的工具。

对于关注 C++ 语言而不是其在特定应用领域中的应用(强调后者)的参考资料,请考虑查看:

StackOverfow C++ FAQ: The Definitive C++ Book Guide and List。

【讨论】:

哇,一定是一本旧书; VS6 早于 C++,因为我们目前对这个术语的理解。 @AsteroidsWithWings 确实如此。 Afaics 这本书的第一版是 2004 年的,我猜 2008 年的第二版只是做了一些小改动(对于不符合标准的示例,可能并可能没有那么多)。 @AsteroidsWithWings 我相信是从 2008 年开始的,但作者在一章中承认大部分是在 2003 年写的。我希望我没有学到任何非常不标准的东西,这是一本非常受好评的书(至少在量化金融领域,在我不认识的 C++ 爱好者中) @Oscar 作者似乎是量化金融领域的知名教授,特别是如果你打算学习该领域,它可能是一个合适的参考。与许多特定领域的参考一样,其中使用的编程语言可能不是对该语言本身的理想参考,而是涵盖该领域的工具(量化金融)。如果您倾向于实际学习 C++(而不仅仅是这个特定领域),请考虑查看 SO C++ FAQ: The Definitive C++ Book Guide and List。 哇。 GCC2。我什至不必支持任何使用 GCC2 编译的项目。

以上是关于C++ 中的“minmax.h”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 :: 是啥意思? [复制]

C++ 中的***是啥?

c++中的引用范围是啥? [复制]

C++中的运算符“”是啥?

C++ 中的“string”、“stream”和“stringstream”类是啥?

是啥使某物成为 C++ 中的抽象类 [重复]