【问题标题】:Which header file should I use instead of #include <bits/stdc++.h> [duplicate]我应该使用哪个头文件而不是#include <bits/stdc++.h> [重复]
【发布时间】:2018-03-30 14:29:28
【问题描述】:
#include <iostream>
#include <string>
#include <sstream>
//#include <bits/stdc++.h>
#include <iomanip>      // std::setprecision
#include <math.h> 
using namespace std;

我想删除标题#include &lt;bits/stdc++.h&gt;,因为它显着减慢了我的编译时间。

当我删除它时,我收到以下错误:

error: cannot convert ‘long double*’ to ‘double*’ for argument ‘2’ to ‘double modf(double, double*)’
       fractpart = modf(val, &intpart);

我认为问题在于缺少头文件,但不知道是哪一个。

我收到错误的代码是:

fractpart = modf(val, &intpart);
if (fractpart != 0) {
    throw Error("ERR");
}

【问题讨论】:

  • 您的错误与包含的头文件没有任何关系。 intpart?是什么类型
  • 您需要区分编译时和运行时,但无论哪种情况,您都不应该包含该标头 - 这是一个可能随时更改或删除的实施功能。
  • 更多不去#include &lt;bits/stdc++.h&gt;的理由:stackoverflow.com/questions/31816095/…

标签: c++ type-conversion include header-files


【解决方案1】:

此类问题的解决方案是咨询相关功能的合适参考。一个备受推崇的 C++ 参考站点是cppreference.com。在这种情况下,它的reference for modf 以:

开头

在标题&lt;cmath&gt;中定义

这就是你的答案。

比较 C++ 标头 &lt;cmath&gt; 中定义的 C++ 版本(一系列重载函数)的上述参考与 C 标头 &lt;math.h&gt; 中定义的 reference for the C version

float modff( float arg, float* iptr );
double modf( double arg, double* iptr );
long double modfl( long double arg, long double* iptr );

C 没有函数重载,所以&lt;math.h&gt; 中的modf 只是double 版本。 &lt;cmath&gt;,是 C++,声明了所有 3 个 C++ 重载(floatdoublelong double),您使用的是最后一个。

这实际上是避免使用 C 标准库标头 (&lt;*.h&gt;) 并使用 C++ 标准库标头 (&lt;c*&gt;) 的原因之一。

【讨论】:

  • 通过添加 cmath 它可以工作,但 c++ 参考 (cplusplus.com/reference/cmath/modf) 说要包括
  • @KarinaK cplusplus.com 在准确性方面的声誉相当差。无论如何,请参阅我之前关于两个标题之间差异的评论。
  • @Karina K math.h 在现代版本的 C++ 标准中已弃用。 正确 C++ 标头是cmath。还;远离 cplusplus.com - 那里有太多不好的信息。首选 cppreference.com。另见:en.cppreference.com/w/cpp/header
  • @KarinaK 它说包括 cmath (看右上角),但确实在示例中显示了 math.h。该示例似乎显示了 C 代码,可能是因为它们在一页上解释了 C 和 C++ 版本。
猜你喜欢
  • 2022-01-11
相关资源
最近更新 更多