Różnica między <string.h> i <strings.h>

91

Zauważyłem, że był (przynajmniej w systemie Mac OS X) zarówno <string.h>nagłówek, jak i <strings.h>nagłówek. man 3 stringujawnia, że ​​mają one różne funkcje. Czy jest jakiś powód?

icktoofay
źródło
2
Mimo wszystko OS X strings.hzawiera niestandardowe funkcje bcmp bcopy bzero ffs index rindex strcasecmp strncasecmp… i to wszystko.
Potatoswatter
3
@Potatoswatter: Robi dokładnie to, co określa POSIX.
R .. GitHub PRZESTAŃ POMÓC W LODZIE

Odpowiedzi:

114

strings.h pochodzi z gałęzi BSD w ewolucji unixa. Jego zawartość została ustandaryzowana przez POSIX, ale większość z nich jest oznaczona jako starsza i można ją łatwo zastąpić innymi funkcjami:

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);
AProgrammer
źródło
4
Niektóre biblioteki C Standard połączyły funkcji non-przestarzałe od strings.hdo string.h. Zobacz np . Glibc .
entropo
19

Zwykle <strings.h>dodaje do standardowego nagłówka kilka przydatnych, ale niestandardowych, dodatkowych funkcji łańcuchowych <string.h>. Aby uzyskać maksymalną przenośność, powinieneś używać tylko, <string.h>ale jeśli potrzebujesz funkcji w <strings.h>więcej niż potrzebujesz, możesz użyć <strings.h>zamiast <string.h>.

Paul R.
źródło
1
Zakwestionowałbym opis tych funkcji jako „przydatne”. Większość z nich to brzydkie duplikaty BSD standardowych funkcji ANSI / ISO C o różnych nazwach. Funkcje porównywania bez rozróżniania wielkości liter dla łańcuchów bajtów (w sensie niezawodności między platformami) prawdopodobnie nie są przydatne w nowoczesnych łańcuchach UTF-8, a nawet jeśli „działają”, prawdopodobnie nie zapewniają semantyki, której oczekuje programista. Tylko ffsmoże się przydać.
R .. GitHub PRZESTAŃ POMÓC W LODZIE
4
@R .: są przydatne, jeśli masz starszy kod BSD do kompilacji, który używa tych funkcji. ;-)
Paul R