Математический интерфейс против cMath в C ++ - PullRequest
9 голосов
/ 05 января 2012

Интерфейс в моей системе сборки MacOS 10.6.3 для математической библиотеки POSIX - math.h, однако в моей целевой системе имя файла интерфейса - cmath.h. В школе мы используем cmath, и я хотел бы убедиться, что мой проект компилируется, когда он передается, как это достигается. Серверы и рабочие станции в школе - x86 под управлением Windows XP. GCC доступен на обеих платформах.

1 Ответ

19 голосов
/ 05 января 2012

В стандарте C ++ функции математической библиотеки определены в двух заголовках:

<cmath>

содержит их в пространстве имен std (например, std::sin), а

<math.h>

содержит их в глобальном пространстве имен (поэтому просто sin).

Между ними есть и другие различия: в то время как <math.h> содержит все математические функции C с разными именами для разных типов, например

double sin(double);
float sinf(float);
long double sinl(long double);

и т. Д., <cmath> содержит перегруженные функции, такие как

namespace std {
    double sin(double);
    float sin(float);
    long double sin(long double);
}

и т. Д.(Библиотеки C ++ могут дополнительно экспортировать sinf из <cmath>, но вы не можете полагаться на это в переносимой программе.)

Наконец, функции fabs, fabsf и fabsl изстандартная библиотека C стала перегружена на std::abs в <cmath>.

Хотя оба заголовка включены в стандарт, вы должны действительно предпочесть <cmath>, так как <math.h> существует только для обратной совместимости с preстандарт C ++ и C.

В стандарте C ++ нет такой вещи, как <cmath.h>.

...