2010-11-27 140 views
78

string.hヘッダーとstrings.hヘッダーの両方が(少なくともMac OS Xでは)存在していました。 man 3 stringは、それらが異なる機能を含むことを明らかにする。これには何らかの理由がありますか?string.hとstrings.hの相違点

+2

、OS X 'strings.h'は' BCMP BCOPY BZERO非標準機能が含まれていますffsインデックスrindex strcasecmp strncasecmp' ...それだけです。 – Potatoswatter

+3

@Potatoswatter:これはPOSIXで指定されているものとまったく同じです。 –

答えて

94

strings.hは、UNIXの進化のBSDブランチから来ています。その内容は、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); 
+20

+1。 –

+2

いくつかのC標準ライブラリは 'strings.h'の廃止されていない関数を' string.h'にマージしました。たとえば、[Glibc](http://www.gnu.org/software/libc/manual/html_mono/libc.html#String_002fArray-Comparison)を参照してください。 – entropo

14

通常、<strings.h>は、標準ヘッダー<string.h>にいくつかの便利で非標準の追加の文字列関数を追加します。ポータビリティを最大限に引き出すには、<string.h>しか使用しないでください。<strings.h>以上の機能が必要な場合は、<string.h>の代わりに<strings.h>を使用してください。

+1

私はこれらの機能の説明を「役に立つ」と質問します。それらのほとんどは、異なる名前の標準ANSI/ISO C関数の醜いBSD複製です。大文字と小文字を区別しないバイト文字列の比較関数は、(クロスプラットフォームの信頼性の点で)おそらく現代のUTF-8文字列では役に立たないでしょうし、プログラマが望むセマンティクスを提供しないかもしれません。おそらく 'ffs'だけが役に立つかもしれません。 –

+3

@R:これらの関数を使用するコンパイル用のレガシーBSDコードがある場合に便利です。 ;-)適切な名前の代わりに –

関連する問題