C++中的"minmax.h"是什么?

3
我一直在脚本中使用 #include <minmax.h>,并像预期那样使用 min()max()。我向别人展示了这个,并且他们从未见过它,说它对他们不起作用,并问我为什么不包括 <algorithm> 并调用 std::min()std::max()
所以我的问题基本上是,为什么我没有这样做?我在 C++ 设计模式和衍生品定价 的书中找到了这个: "C++ Design Patterns and Derivatives Pricing"。谷歌搜索 "minmax.h",我发现在顶部的结果中有一个对该书的引用,这更让我认为它是不正常的东西。
是否有人能告诉我这是什么?

1
可能是由于Windows API标头曾经使用了#define minmax,导致尝试同时使用标准C++和Windows API时产生了大量问题。 - aschepler
1
你是否也需要提供那个头文件?如果是,你从哪里得到它的?如果不是,你使用的是什么平台? - Asteroids With Wings
1
我找到了这个,也许那就是你正在使用的。 - Leonardo Alves Machado
该书的第二版没有使用 #include <minmax.h>,似乎使用了标准的 <algorithm> 算法库。编辑:实际上它确实使用了,但是搜索 minmax.h 失败了。当我搜索 minmax 时找到了它。 - Ted Lyngmo
@AsteroidsWithWings 我没有这样做,我只是写了 #include <minmax.h>,它似乎能工作,我检查了我的代码以确保,并检查了书中是否提供了一些代码,但没有,只有 #include <minmax.h> 部分。我正在使用 Visual Studios 并在 Windows 上运行。 - Oscar
3个回答

7
C++编程语言配有C++标准库。C++标准库中没有<minmax.h>头文件。标准库中没有任何一个头文件的扩展名为.h。此外,该头文件也不是移植的C标准库的一部分,因为这些头文件具有c前缀,例如<cmath>(用于替换C标准库的<math.h>头文件)、<ctime>(用于替换<time.h>头文件),当从C++标准库中使用时。 std::minstd::max函数声明在<algorithm>头文件中。

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


注意:只有在从C++中访问时,C标准库头文件才具有"c"前缀。 - Kuba hasn't forgotten Monica

3
为什么我没有用它?
人们会做各种奇怪的事情,可能是在学校听说过,或者因为某个“解决方案”可以解决他们的即时需求(通常是在时间限制下)。 然后他们继续以相同的方式做事,因为这些方法“有效”。但很高兴你停下来问了一分钟。希望我们能让你回归可移植的C++路线 :)
不需要使用非标准的minmax.h头文件。在Windows上,您需要在包含任何头文件之前定义NOMINMAX宏,并立即在此宏定义后包含。这只是为了避免ill-conceived WINAPI宏占用min和max符号。在C++中,std::min等在头文件中,这就是您应该使用的。因此,以下代码是可移植的:
#define NOMINMAX
#include <algorithm>
// other includes
#undef NOMINMAX

// your code here

详见此答案,了解Windows相关信息。


1

一本关于C++的古老参考书,使用古老编译器,提供使用非标准C++的示例(例如包含minmax.h头文件)

请注意,您提到的书籍C++ Design Patterns and Derivatives Pricing(M.S. Joshi),最初发布于2004年,随后于2008年发行了第二版。如下面的摘录所示,该书中的示例依赖于古老的编译器版本的成功编译(在2004年并不算太古老,但仍远非最近版本)。

该书的附录D甚至特别提到,本书涵盖的代码示例可能不符合标准,并提出实用建议:"[...]修复问题不应该很难"[我强调]:

这段代码已经在三个编译器下测试过:MingW 2.95,Borland 5.5和Visual C++ 6.0。前两个编译器都是免费的,因此您应该没有问题找到适合该代码的编译器。此外,MingW是GNU编译器GCC的Windows移植版,因此该代码也应该适用于该编译器。Visual C++不是免费的,但在城市中很受欢迎,入门版本的价格不是很贵。此外,我努力使用的只有ANSI/ISO代码,因此该代码应该可以在任何编译器下运行。无论如何,它不使用任何尖端语言特性,因此,如果与您的编译器不兼容,则修复问题不应该很难。

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

像其他古老的编译器一样,这些编译器提供了非标准头文件,如minmax.h,这似乎是一种相当普遍的非标准惯例,基于以下参考资料。

C++语言的备选参考资料

基于上述内容,该书最主要应被视为其主要领域——量化金融的参考资料,而不是仅仅作为C++的参考资料,后者只是用来涵盖前者的工具。

如果需要专注于C++语言本身而非其在特定应用领域中的应用(强调后者),可以考虑查看以下参考资料:


哇,这一定是一本旧书了;VS6比我们现在理解的C++还要早。 - Asteroids With Wings
@AsteroidsWithWings 确实。据我所知,该书的第一版是在2004年出版的,我猜第二版是在2008年出版的,只做了一些小的修补(可以说对于非标准兼容的示例可能不太明显)。 - dfrib
@AsteroidsWithWings,我相信这是2008年的书,但作者在一章中承认大部分内容是在2003年写的。我希望我没有学到任何非常规的东西,这是一本相当受推崇的书(至少在量化金融领域,在C++爱好者中我不知道)。 - Oscar
@Oscar 作者似乎是量化金融领域的知名教授,因此如果您想学习该领域,这可能是一个合适的参考。与许多特定领域的参考资料一样,其中使用的编程语言可能不是语言本身的理想参考,而是覆盖该领域(量化金融)的工具。如果您倾向于实际学习C++(而不仅仅是这个特定领域),可以看看SO C++ FAQ:权威的C++书籍指南和列表 - dfrib
@dfri 谢谢!我会仔细查看那个列表。 - Oscar
1
哇,GCC2。我甚至不需要支持使用GCC2编译的任何项目。 - user4581301

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