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 min
和 max
的事实有关,导致尝试同时使用标准 C++ 和 Windows API 时头疼。
您是否还必须提供该标题?如果是这样,你是从哪里得到的?如果没有,你在哪个平台上?
我找到了this,也许这就是你正在使用的
本书第二版不做#include <minmax.h>
。它似乎使用标准的<algorithm>
算法。编辑:是的,但搜索minmax.h
失败。搜索minmax
时找到了。
@AsteroidsWithWings 我没有,我只是写了#include 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 标头,它定义了 min
和 max
宏,而不是函数。但是,这是一些特定于实现的标头,您应该改用标准的 <algorithm>
标头。
【讨论】:
注意:: C 标准库头文件在从 C++ 访问时只有c
前缀。【参考方案2】:
为什么不是我?
人们会在某个地方听说过各种奇怪的事情,无论是在学校还是作为某种“解决方案”解决了他们的迫切需求(通常是在时间压力下)。然后他们继续以同样的方式做事,因为他们“工作”。但我很高兴你停下来问一问。希望我们能引导你回到可移植的 C++ 路线:)
不,不需要使用非标准的 minmax.h
标头。在 Windows 上,您需要定义 NOMINMAX
宏之前您包含任何标题,并在此宏定义之后包含 <algorithm>
。这只是为了使min
和max
符号免于被构思不当的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
)并不奇怪,特别是因为它似乎是一种常见的非标准约定,基于例如以下参考资料。
minmax.h
,可能在 GCC 2.95 中可访问,
Known problems in using the Microsoft Visual C++ compiler, version 6.0:
What is the worst real-world macros/pre-processor abuse you've ever come across?:MS 库没有定义最小和最大算法,应该在我们使用的解决方法是定义一个新的头文件,比如 minmax.h,我们将其包含在任何使用这些函数的文件中:[. ..]
现实世界? 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”是啥?的主要内容,如果未能解决你的问题,请参考以下文章