cmath vs math.h (и аналогичные c-префиксы против заголовков расширений .h)
Я видел некоторую информацию о различиях между такими вещами, как iostream
vs iostream.h
. Из того, что я извлек из них, разница между ними заключается в том, что версия без расширения .h
не будет заполнять пространство имен, а версия с расширением будет.
Это то же самое для cmath
vs math.h
? Почему cmath
(и многие другие подобные файлы) имеют префикс c
а не просто math
? Есть ли еще различия между ними?
Ответы
Ответ 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.)