この記事では標準ライブラリを使うさいに注意すべきことを記載します。
標準ライブラリ関数で実現できることは標準ライブラリ関数を使用してください。特にメモリ操作系、文字列操作系の関数をわざわざ自作していることがよくあります。例えばmemcpy, memcmp, strstrなどです。メモリ操作や文字列操作にて自作関数を作ろうと思い立ったときは、一歩たちどまって標準ライブラリの一覧を見てみてください。すでにそこにほしい関数があるこかもしれません。
逆にロケール設定に依存するマルチバイト系の関数や時間系の関数は使用しないでください。たいてい意図通りにはうごきません。
setjmp, longjmpは使用しない
標準ライブラリ関数 setjmp, longjmp関数はマルチタスク環境下では正常に動作しないので利用しないでください。
time.hは使用しない
標準ライブラリのtime.hの関数は、実装依存が多く期待通りに動作しないので使用しないでください。
スレッドアンセーフな標準ライブラリ関数は使用しない
マルチタスク環境下では、スレッドアンセーフな関数は正常に動作しません。下記の関数は、標準ライブラリ関数を含むPOSIXの、スレッドアンセーフな関数です。使用しないでください。同等のスレッドセーフな代用関数が用意されている場合がありますので、それを使ってください。(ex. strtok_r, rand_r, etc…)
POSIXのスレッドアンセーフ関数一覧
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を渡すとスレッドアンセーフな関数)
ctermid tmpnam wcrtomb wcsrtombs
以上、組み込み環境での標準ライブラリのコーディング規約でした!
他のコーディング規約は下記のページからたどれます。ぜひ見てみてくださいね
C言語コーディング規約
組込みソフト(ファームウェア)向けのc言語コーディング規約を書いています。これをみておけばcの文法的なミス減らせるかなと思います。また、C言語のベテランの方もひとつくらいは新しい発見があると思います。ぜひご参考ください! コーディング規約一...
コメント