Différence entre <string.h> et <strings.h>

90

J'ai remarqué qu'il y avait (au moins sur Mac OS X) à la fois un en- <string.h>tête et un en- <strings.h>tête. man 3 stringrévèle qu'ils contiennent des fonctions différentes. Y a-t-il une raison quelconque pour cela?

icktoofay
la source
2
Pour ce que ça vaut, OS X strings.hcontient des fonctions non standard bcmp bcopy bzero ffs index rindex strcasecmp strncasecmp… et c'est tout.
Potatoswatter
3
@Potatoswatter: Il fait exactement ce qui est spécifié par POSIX.
R .. GitHub STOP AIDER ICE

Réponses:

114

strings.h provient de la branche BSD dans l'évolution unix. Son contenu a été normalisé par POSIX, mais la plupart est marqué comme hérité et peut être facilement remplacé par d'autres fonctions:

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);
Programmeur
la source
4
Certaines bibliothèques standard C ont fusionné les fonctions non obsolètes de strings.hdans string.h. Voir, par exemple, Glibc .
entropo
19

En général, <strings.h>ajoute simplement des fonctions de chaîne supplémentaires utiles mais non standard à l'en-tête standard <string.h>. Pour une portabilité maximale, vous ne devez utiliser que <string.h>mais si vous avez besoin des fonctions <strings.h>plus que ce dont vous avez besoin, vous pouvez utiliser à la <strings.h>place de <string.h>.

Paul R
la source
1
Je remettrais en question la description de ces fonctions comme «utiles». La plupart d'entre eux sont des doublons BSD laids de fonctions standard ANSI / ISO C avec des noms différents. Les fonctions de comparaison insensibles à la casse pour les chaînes d'octets ne sont probablement pas utiles (dans un sens de fiabilité multiplateforme) sur les chaînes UTF-8 modernes, et même si elles "fonctionnent", elles ne fournissent probablement pas la sémantique souhaitée par le programmeur. Seul ffsest peut-être utile.
R .. GitHub STOP AIDER ICE
4
@R .: ils sont utiles si vous avez un ancien code BSD à compiler qui utilise ces fonctions. ;-)
Paul R