2010-11-27 14 views
78

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

+2

Pour ce que ça vaut la peine strings.h', OS X contient des fonctions '' bcmp non standard 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épondre

94

strings.h provient de la branche BSD dans l'évolution unix. Son contenu a été normalisé par POSIX, mais la majeure partie est marqué comme héritage 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); 
+20

+1 pour nommer les remplacements corrects. –

+2

Certaines bibliothèques standard C ont fusionné les fonctions non-obsolètes de 'strings.h' dans' string.h'. Voir, par exemple, [Glibc] (http://www.gnu.org/software/libc/manual/html_mono/libc.html#String_002fArray-Comparison). – entropo

14

Généralement, <strings.h> ajoute simplement des fonctions de chaînes supplémentaires utiles mais non standard à l'en-tête standard <string.h>. Pour une portabilité maximale, vous devez utiliser uniquement <string.h>, mais si vous avez besoin des fonctions <strings.h> plus que vous avez besoin de portabilité, vous pouvez utiliser <strings.h> au lieu de <string.h>.

+1

Je voudrais remettre en question la description de ces fonctions comme "utile". La plupart d'entre eux sont des duplications BSD moche de fonctions standard ANSI/ISO C avec des noms différents. Les fonctions de comparaison insensible à la casse pour les chaînes d'octets sont (dans un sens de fiabilité multi-plateforme) probablement inutiles 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 'ffs' est peut-être utile. –

+3

@R .: ils sont utiles si vous avez un ancien code BSD à compiler qui utilise ces fonctions. ;-) –