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

C言語を使って移植性の高いプログラミングを行うのは簡単ではありません。このブログでは、筆者自身の備忘録を兼ねて、移植性のあるプログラミングのノウハウを記録していきたいと思います。
<< July 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 31 >>
 
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
 
スポンサーサイト

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


- | | - | -
ヘッダ名
随分久々の更新ですが、今回は#include指令で指定するヘッダ名に関する話題です。ヘッダ名の指定方法が大きく分けて二つあることは、C言語を使われている方であればよくご存知のはずです。すなわち、<...>の形式と"..."の形式です。まずは、この二つの形式の違いから見ていきたいと思います。

まず、<...>の形式ですが、これは本来は処理系が提供するヘッダを指定するためのものですが、規格上はやや曖昧で、「処理系で処理可能なヘッダ」という分かったようなわからないような記述になっています。そして、このヘッダというのは必ずしもファイルである必要はありません。また、どのようにしてヘッダの探索場所を指定するか、どのようにしてヘッダを識別するかも処理系定義になっています。

次に、"..."形式ですが、こちらは基本的にはソースファイルを取り込むためのものです。そして、指定したソースファイルの探索方法は処理系定義です。

最も一般的な探索手順は、#include指令が記述されたソースファイルと同じディレクトリをまずは探索し、そこで見つからなければ、そのソースファイルが取り込まれたソースファイルと同じディレクトリを探索し...というように、最初に#include指令を使ったソースファイルと同じディレクトリまで遡るというものです。他には、常に作業ディレクトリを探索するという処理系もあります。

また、標準規格には"..."形式に関するところ(JIS X3010:2003 6.10.2 ソースファイル取込み)で、「この探索をサポートしていない場合」という記述があるので、"..."形式を指定しても<...>と同じになってしまう場合があるようです。この場合に、ヘッダがファイルではないとすると、ヘッダを追加する術は全くなくなってしまうわけですが、簡易的なインタープリタのようなものを除けば、まずこのような処理系に遭遇することはないと思います。

ところで、これを書くとWindows環境で作業されている方々は愕然とするかもしれませんが、ヘッダ名の中に逆斜線が含まれていた場合の動作は未定義になります。他にも ', ", //, /* が含まれていた場合も動作が未定義になります。また、規格上識別されることが保証されるヘッダ名は、英字で始まる英数字の並びの後に、1つのピリオドと英字1文字が続く名前ということになっています。また、英字の大文字・小文字の区別があるとは限らず、ピリオドの前の英数字の並びのうち確実に有効なのは6文字(C99では8文字)です。

このように見ていくと、規格厳密合致プログラムを書こうとすると、ヘッダファイルを自作することは不可能だということになります。しかし、この件に関しては、規格厳密合致プログラムにこだわることを止め、現実に十中八九問題のない選択を行うということであれば、かなり状況が緩和されます。

まず、ヘッダ名に指定できる名前の有意文字数の制限は実質的になくなります。Windowsのことを考えると大文字・小文字に依存するのは止めた方がよいでしょう。また、ディレクトリの区切りには、¥ ではなく / を使うべきです。

次に、ヘッダファイルの探索順序についてですが、"..."形式の探索順序を指定できるコンパイラは非常に稀ですが、<...>形式であれば、-Iオプションやそれに相当するものがほとんどのコンパイラで使えますので、これに依存することは問題ないでしょう。というわけで、"..."の探索順序にさえ依存しなければ、ほぼ移植性のあるコードを書くことができそうです。

スポンサーサイト

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









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