C言語規約シリーズです。今回は標準ライブラリについてです。
この記事では標準ライブラリを使うさいに注意すべきことを記載します。
標準ライブラリ関数で実現できることは標準ライブラリ関数を使用してください。
特にメモリ操作系、文字列操作系の関数をわざわざ自作していることがよくあります。
例えばmemcpy memcmp strstrなどです。
メモリ操作や文字列操作にて自作関数を作ろうと思い立ったときは、一歩たちどまって標準ライブラリの一覧を見てみてください。すでにそこにほしい関数があるかもしれません。
逆にロケール設定に依存するマルチバイト系の関数や時間系の関数は使用しないでください。たいてい意図通りにはうごきません。
setjmp, longjmpは使用しない#
標準ライブラリ関数 setjmp,
longjmp関数はマルチタスク環境下では正常に動作しないので利用しないでください。
time.hは使用しない#
標準ライブラリのtime.hの関数は、実装依存が多く期待通りに動作しないので使用しないでください。
スレッドアンセーフな標準ライブラリ関数は使用しない#
マルチタスク環境下では、スレッドアンセーフな関数は正常に動作しません。
下記の関数は、標準ライブラリ関数を含むPOSIXの、スレッドアンセーフな関数です。使用しないでください。
同等のスレッドセーフな代用関数が用意されている場合がありますので、それを使ってください。
(ex. strtok_r, rand_r, etc…)
POSIXのスレッドアンセーフ関数一覧#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| asctime basename catgets crypt
ctime dbm_clearerr dbm_close dbm_delete
dbm_error dbm_fetch dbm_firstkey dbm_nextkey
dbm_open dbm_store dirname dlerror
drand48 ecvt encrypt endgrent
endpwent endutxent fcvt ftw
gcvt getc_unlocked getchar_unlocked getdate
getenv getgrent getgrgid getgrgid
getgrgid getgrnam gethostbyaddr gethostbyname
gethostent getlogin getnetbyaddr getnetbyname
getnetent getopt getprotobyname getprotobynumber
getprotoent getpwent getpwnam getpwuid
getservbyname getservbyport getservent getutxent
getutxid getutxline gmtime hcreate
hdestroy hsearch inet_ntoa l64a
lgamma lgammaf lgammal localeconv
localtime lrand48 mrand48 nftw
nl_langinfo ptsname putc_unlocked putchar_unlocked
putenv pututxline rand readdir
setenv setgrent setkey setpwent
setutxent strerror strtok ttyname
unsetenv wcstombs wctomb
|
(出力用の引数にNULLを渡すとスレッドアンセーフな関数)
1
| ctermid tmpnam wcrtomb wcsrtombs
|
以上、組み込み環境での標準ライブラリのコーディング規約でした!
Note
下記のC言語コーディング規約シリーズも併せてご参照ください