Подтвердить что ты не робот

cmath vs math.h (и аналогичные c-префиксы против заголовков расширений .h)

Я видел некоторую информацию о различиях между такими вещами, как iostream vs iostream.h. Из того, что я извлек из них, разница между ними заключается в том, что версия без расширения .h не будет заполнять пространство имен, а версия с расширением будет.

Это то же самое для cmath vs math.h? Почему cmath (и многие другие подобные файлы) имеют префикс c а не просто math? Есть ли еще различия между ними?

4b9b3361

Ответ 1

Я видел некоторую информацию о различиях между такими вещами, как iostream vs iostream.h.

[iostream.h] не является стандартным заголовком.

это не пример проблемы, которую вы поднимаете.

[cmath] определяет символы в пространстве имен std и может также определять символы в глобальном пространстве имен. [math.h] определяет символы в глобальном пространстве имен и может также определять символы в пространстве имен std. если вы включите первый и используете неквалифицированный символ, он может компилироваться с одним компилятором, но не с другим. поэтому неплохо использовать [math.h]. и в общем случае для таких пар заголовков использовать версию [.h].

С++ 98 предоставил формальную гарантию заголовка c xxx, не загрязняя глобальное пространство имен. возможно, именно поэтому они были определены. однако это было немного сложнее реализовать, чем загрязняющие, поэтому на практике стандартная реализация библиотеки, которую я знаю, не соответствовала стандарту в этом отношении, и поэтому она была окончательно изменена, чтобы отразить реальность в С++ 11.

Ответ 2

Может быть, это будет полезно:

Библиотека C++ включает в себя те же определения, что и библиотека языка C, организованная в той же структуре заголовочных файлов, со следующими отличиями:

1 - Каждый заголовочный файл имеет то же имя, что и версия на языке C, но с префиксом "c" и без расширения. Например, эквивалентом C++ для заголовочного файла языка C <stdlib.h> является <cstdlib>.

2 - Каждый элемент библиотеки определен в пространстве имен std.

c-префикс vs.h заголовки расширений

Ответ 3

Заголовки, имена которых начинаются с c, выводятся из заголовков стандартной библиотеки C. Соответствующие заголовки с префиксом c удалены и добавленный суффикс .h идентичны (или почти идентичны) с заголовками стандартной библиотеки C.

<cmath> определяет соответствующие символы в пространстве имен std; <math.h> определяет их глобально.

(Я просто узнал, что это не так просто, см. ответ Alf.)