Разница между <string.h> и <strings.h>


91

Я заметил, что есть (по крайней мере, в Mac OS X) и <string.h>заголовок, и <strings.h>заголовок. man 3 stringпоказывает, что они содержат разные функции. Есть ли этому повод?


2
Как бы то ни было, OS X strings.hсодержит нестандартные функции bcmp bcopy bzero ffs index rindex strcasecmp strncasecmp… и все.
Potatoswatter

3
@Potatoswatter: он делает именно то, что указано в POSIX.
R .. GitHub НЕ ПОМОГАЕТ ICE

Ответы:


114

strings.h происходит из ветки BSD в эволюции unix. Его содержимое стандартизировано POSIX, но большая его часть помечена как устаревшая и может быть легко заменена другими функциями:

int    bcmp(const void *, const void *, size_t); /* LEGACY, see memcmp */
void   bcopy(const void *, void *, size_t); /* LEGACY, see memcpy, memmove */
void   bzero(void *, size_t); /* LEGACY, see memset */
int    ffs(int);
char  *index(const char *, int); /* LEGACY, see strchr */
char  *rindex(const char *, int); /* LEGACY, see strrchr */
int    strcasecmp(const char *, const char *);
int    strncasecmp(const char *, const char *, size_t);

4
Некоторые стандартные библиотеки C объединили нерекомендуемые функции strings.hв string.h. См., Например, Glibc .
entropo

19

Обычно <strings.h>просто добавляет в стандартный заголовок несколько полезных, но нестандартных дополнительных строковых функций <string.h>. Для максимальной переносимости вы должны только использовать, <string.h>но если вам нужны функции <strings.h>больше, чем вам нужна переносимость, вы можете использовать <strings.h>вместо <string.h>.


1
Я бы поставил под сомнение описание этих функций как «полезных». Большинство из них являются уродливыми дубликатами BSD стандартных функций ANSI / ISO C с разными именами. Функции сравнения байтовых строк без учета регистра (с точки зрения межплатформенной надежности), вероятно, бесполезны для современных строк UTF-8, и даже если они «работают», они, вероятно, не обеспечивают семантику, которую хочет программист. Только ffsвозможно полезно.
R .. GitHub НЕ ПОМОГАЕТ ICE

4
@R .: они полезны, если у вас есть старый код BSD для компиляции, который использует эти функции. ;-)
Paul R
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.