Ответ 1
<cstring>
новее; <string.h>
действительно существует для обратной совместимости (и для C, конечно). Разница в том, что <cstring>
помещает строковые функции в пространство имен std
, а <string.h>
помещает их в глобальное пространство имен.
Кроме того, <cstring>
изменяет типы определенных функций для повышения безопасности типов. Например, декларация C
char *strchr(char const *, int);
заменяется перегрузками (в пространстве имен std
)
char *strchr(char *, int);
char const *strchr(char const *, int);
В случае <cmath>
существуют дальнейшие различия с <math.h>
, которые делают <cmath>
более идиоматичным и менее C-подобным.
Предпочитает <cstring>
для нового кода и использовать префикс std::
для функций.