組込みソフト向けC言語コーディング規約|標準ライブラリ

この記事は約4分で読めます。

この記事では標準ライブラリを使うさいに注意すべきことを記載します。
標準ライブラリ関数で実現できることは標準ライブラリ関数を使用してください。特にメモリ操作系、文字列操作系の関数をわざわざ自作していることがよくあります。例えば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

以上、組み込み環境での標準ライブラリのコーディング規約でした!

コメント