[C] typedefの使い方

勤務先の人と話していた時に、C言語についてのいくつかのcoding styleを見るとtypedefを使わない方がいいと言われているけど、使い方次第だよね、という話になった。

コーディングスタイルはプログラマならだれでも好みがある。stackoverflow.comでも何度も出てくる話題である。

Why is “typedef struct foo foo;” considered harmful?

この中で参照されているOpenBSDやLinuxのcoding styleや、 Expert C Programmingでは、構造体にたいして

typedef struct foo foo;

のように同じ名前をtypedefすることを避けるほうがいいという記述があるようだ。

話をしてくれた人は、struceやenumをいちいち書きたくないので、わかりやすいtypedef名であればいいのではないか、という意見。ただし、

typedef struct foo *  foo;

のようにポインタであることが一見してわからなくなるような使い方は避けたほうがいいのではないか、という条件付き。

上記のstackoverflowの中では、中身を見せない構造体として使うならいいのでは、というコメントが何回かある。
中身へのアクセスは set, get関数を作るようにしておけば記述が簡素になってわかりやすいコードになるのではないかと自分も思う。

stackoverflowのコメントによれば、MISRA-Cには、構造体と同じ識別子は避けた方が問題が起こらない、という記述があるらしい。

もしかすると当初のC言語にはtypedefがなかったため、「ベテラン」はそれを使わないことが多かったのでは、という説まで勤務先では出ていた。新しい言語仕様に対応していないガイドラインというのはひよくある問題である。

手元に初版本がないのでインターネットであれこれ調べたところではtypedefは当初から言語仕様にはあったようなので、「ベテラン」の老害ではなさそうだ。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。