【问题标题】:is <math.h> for C or C++?<math.h> 是 C 还是 C++?
【发布时间】:2016-06-19 07:02:14
【问题描述】:

我需要在 .cpp (c++) 源文件中使用自然对数函数。现在,我当然可以通过快速的谷歌搜索和简单的库解决方案来做到这一点。但是我有点迷茫……

在cplusplus dot com网站的reference/cmath/log/下有一个如何使用日志功能的例子,如下

/* log example */
#include <stdio.h>      /* printf */
#include <math.h>       /* log */

int main ()
{
   double param, result;
   param = 5.5;
   result = log (param);
   printf ("log(%f) = %f\n", param, result );
   return 0;
}

我有一些问题:

1) 他们为什么使用

<stdio.h>

我以为这是针对 C 而不是真的针对 C++?

2) 他们为什么使用

<math.h>

虽然 .h 代表 C 头文件而不是 .hpp C++ 头文件?

忘记使用 stdio(无论如何我都会使用 iostream),但即便如此使用

<math.h>

感觉就像我在编写 C 代码而不是 C++ 代码。我通过一门教学课程学习 C++,讲师在第一周介绍了 C,然后说我们不会再使用 C,但从现在开始会使用 C++。如果老师问“你为什么使用 C 头文件?你应该是用 C++ 工作的”,我觉得我无法解释自己。

任何解释都非常感谢。

【问题讨论】:

  • 对于 C++,使用 &lt;cmath&gt; 而不是 &lt;math.h&gt;
  • 该名称的标头在 C 和 C++ 标准库中都可用,并且通常是同一个文件。
  • @Paul blimey 你的回复很快。我看到了,但是,在另一个 cmath vs math.h stackoverflow 问题中,提供的答案指出“它可以用一个编译器编译,但不能用另一个编译器编译。因此使用 [math.h] 是个好主意”。这让我更加困惑。
  • 但为什么是 .h 而不是 .hpp
  • 大多数带有 .h 后缀的标准 C 库头文件都有一个 C++ 等效项,它负责 std 命名空间,添加 c 前缀并删除 .h 后缀。

标签: c++ math logging


【解决方案1】:

&lt;math.h&gt; 是 C 标准中指定的标头。它在 C++ 中受支持,但已被所有 C++ 标准正式弃用(这大约意味着,可能会从未来的标准中删除)。我建议它不太可能从未来的 C++ 标准中删除,只要向后兼容 C 被认为是重要或可取的。

&lt;cmath&gt; 是 C++ 标准中指定的标头。它提供了与 C 的 &lt;math.h&gt; 中基本相同的功能,除了名称(除了几个宏之外)驻留在命名空间 std 中。

&lt;stdio.h&gt; (C) 和 &lt;cstdio&gt; (C++) 也有类似的情况,只是在 C++ 中鼓励使用流 I/O(例如 &lt;iostream&gt;)。

标准 C++ 标头从不具有 .hpp 扩展名。标题的命名约定是一些人鼓励的约定,但不是正式要求。

【讨论】:

    【解决方案2】:

    C++11 Standard 说:

    D.5 C 标准库头文件

    1 为了与 C 标准库和 C Unicode TR 兼容,C++ 标准库提供了 25 个 C 标头,...

    包含这些标头被声明为已弃用,意思是:

    标准当前版本的规范,但不保证在未来的修订中成为标准的一部分。

    所以他们仍然(只是)C++ 的一部分。

    它们是为了兼容性而提供的,这允许程序员使用符合标准的C++ 编译器编译最初为C 编写的程序,只需很少或不需要修改。这意味着不必将 #include 语句从 &lt;stdio.h&gt; 更改为 &lt;ctsdio&gt;

    所以cplusplus.com 中给出的示例实际上是符合C++ 的标准,恰好与C90 和符合CC99 编译器兼容。他们这样做可能是因为描述数学库的页面提供了CC++ 语言的信息,这些信息遵循C90C99C++98C++11 的标准。

    所以回答具体问题:

    1) 他们为什么使用

    <stdio.h>
    

    我以为这是针对 C 而不是真的针对 C++?

    这是为了C++ 兼容性C。大概他们使用它,因此代码也将在符合 CC90/C99 编译器上编译,页面给出了规范。

    1) 他们为什么使用

    <math.h>
    

    虽然 .h 代表 C 头文件而不是 .hpp C++ 头文件?

    没有。该标准没有指定应该使用哪些扩展文件。在实践中,许多C++ 项目使用.h 作为其头文件的扩展名。

    如果老师问“你为什么使用C头文件?”,我觉得我无法解释自己。

    鉴于C 兼容性标头已被弃用(尽管可能不会去任何地方),我建议最好使用&lt;cstdio&gt;&lt;cmath&gt; 版本。但是,仅仅因为您选择库函数而以某种方式编写C 代码的想法是错误的。如果通过C++ 编译器提供的C++ 代码是合法的,那么它就是C++。它可能在性格上更程序,在哲学上更少面向对象,但它仍然完全是C++。很多很多C++ 程序使用用其他语言编写的库,尤其是C。这不会让这些程序不知何故C

    【讨论】:

      【解决方案3】:

      关于您的第一个问题,使用的 printf 函数需要 stdio.h
      关于第二个问题,C 和 C++ 都可以使用 math.h,但是 cmath 将定义 std 命名空间中的方法,而 math.h 将定义全局命名空间中的方法

      一般来说,您可以在 C++ 代码中使用 C 代码,通常不会有任何问题,尤其是在处理诸如 math.h 之类的知名库时

      【讨论】:

      • 是的,我知道 printf 需要 stdio,但他们为什么要在 C++ 参考网站上这样做,这肯定是 C 而不是 C++?
      • 您是对的,它是 C 语法,您在使用 C++ 时应该使用 std::cout(iostream 而不是 stdlib)来打印内容。话虽如此,在 C++ 中使用 stdio 并没有什么坏处,它是完全支持的,坦率地说,有些人只是习惯了它
      • 还有cstdio,它至少使用了std::命名空间的优势,和cmath一样。
      • @RunnerBean 如果您愿意,可以尝试其他参考站点,例如 cppreference。我个人认为它更干净并且有更好的示例,虽然我已经有一段时间没有查看 cplusplus.com 了,这可能只是我的偏好。
      【解决方案4】:

      &lt;math.h&gt;(for C) 和&lt;cmath&gt;(for C++) 在函数的基本用法上非常相似。 &lt;cmath&gt; 在更高级的阶段开始有所不同,包括模板、STL 和一般的面向对象编程。

      无论你使用 C 还是 C++,&lt;math.h&gt; 都可以使用,但我认为相反的(&lt;cmath&gt; for C)行不通。我推荐 C++ 使用 &lt;cmath&gt;,因为它与 相同,但具有更强大的 OOP 功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多