移植性のあるCプログラミング

C言語を使って移植性の高いプログラミングを行うのは簡単ではありません。このブログでは、筆者自身の備忘録を兼ねて、移植性のあるプログラミングのノウハウを記録していきたいと思います。
<< June 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
 
PROFILE
RECOMMEND
Cプログラミング診断室―さらに美しく健康的なプログラムのために
Cプログラミング診断室―さらに美しく健康的なプログラムのために (JUGEMレビュー »)
藤原 博文
私がある程度C言語でプログラミングができるようになった頃、この本の旧版を読みました。
非常に辛口の内容であり、読者によっては嫌悪感を抱く方もおられるかもしれませんが、「Cプログラミング診断室」は、C言語に関する数少ない有益な書籍のひとつです。もっとも、元の内容がかなり古いため、今となってはやや時代遅れとなった部分もあります。しかし、それを差し引いても、十分に読む価値のある一冊です。
RECOMMEND
新ANSI C言語辞典
新ANSI C言語辞典 (JUGEMレビュー »)
平林 雅英
まだC言語を覚えたてだった頃、この本の前の版である「ANSI C言語辞典」がボロボロになるまで活用しました。私が購入したC言語関連の書籍の中では、最もコストパフォーマンスが高かったと思います。
あまりにもボロボロになったので、改訂版にあたる、この「新ANSI C言語辞典」を購入しました。旧版を最初に手にしてから10年以上経ちますが、今なお手放すことができない必携の一冊です。
ARCHIVES
RECENT COMMENT
RECENT TRACKBACK
MOBILE
qrcode

無料ブログ作成サービス JUGEM
 
スポンサーサイト

一定期間更新がないため広告を表示しています


- | | - | -
voidへのポインタ
voidへのポインタというと、どんな型へのポインタでも代入でき、どんな型へのポインタにでも暗黙的に型変換できる汎用ポインタです。しかし、voidへのポインタとの相互変換ができないポインタがあることをご存知でしょうか?

JIS X3010:2003の6.3.2.3 ポインタには、次のように記述されています。
voidへのポインタは, 任意の不完全型若しくはオブジェクト型へのポインタに, 又はポインタから, 型変換してもよい。任意の不完全型又はオブジェクト型へのポインタを, voidへのポインタに型変換して再び戻した場合, 結果は元のポインタと比較して等しくなければならない。
つまり、相互に型変換できるのは、不完全型へのポインタとオブジェクト型へのポインタだけということになります。

不完全型というのは、要素数を指定しない配列型や、struct タグ名だけの構造体や、同様の共用体・列挙体や、void型のことです。オブジェクト型というのは、算術型(整数型・実浮動小数点型・複素数型)・集成体型(配列型・構造体型)・共用体型・ポインタ型の総称です。

では、不完全型でもオブジェクト型でもない型というのは何でしょうか?それは関数型です。つまり、関数へのポインタとvoidへのポインタとは互いに変換できないのです。本来はキャストすることもできません。もっとも、変換できてしまうコンパイラの方が多いのですが...。

関数へのポインタとvoidへのポインタに互換性がないのには理由があります。MS-DOSやWin16のプログラミングを経験された方なら記憶があると思いますが、8086のミディアムモデルやコンパクトモデルでは、コードへのポインタとデータへのポインタではサイズが異なりました。また、サイズだけではなくメモリ空間も異なるので、両者には全く互換性がないわけです。アーキテクチャによっては、コードとデータでは語長すら異なる可能性があります。

というわけで、voidへのポインタに関数へのポインタを格納することは、移植性の観点からは絶対に行ってはならないことです。

スポンサーサイト

- | 00:32 | - | -
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://portable-c.jugem.jp/trackback/21