[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
protoize
を使うときの注意点 変換プログラム protoize
と unprotoize
は、
読者が手で調整しないと正しく動作しないように、ソースファイルを
変更してしまうことがたまにある。
protoize
は、型名や型のタグに対する参照を、その定義の前か、
定義がない場合はファイル内に挿入することができる。
これが起きた場合、コンパイラはエラーメッセージでどこに 新しい参照が挿入されたかを示すようにし、手動によるファイルの修正が 簡単にできるようにしなければならない。
protoize
が正しく認識できないものがある。
例えば、関数へのポインタ変数の宣言の引数の型を決定できない。
ユーザが自分でやらなければならないのである。
protoize
は、そういう変数を見つける度に、‘???’ という
文字列の入ったコメントを挿入する。問題となる変数を全部見つけるには
この文字列を検索すれば良い。ANSI C は、関数へのポインタ型の
引数の型を宣言することを要求していない。
unprotoize
を使うと簡単にバグが入ってしまう可能性がある。
プログラムが、プロトタイプにより引数の型変換を引き起こされることを
前提にしている場合、この変換はプロトタイプ宣言がないと引き起こされない。
ひとつ unprotoize
が安全であると言える時というのは、
protoize
が作ったプロトタイプ宣言を削除する時である。
プログラムが、以前にプロトタイプ宣言一切なしで動作していたなら、
それらがまたなくなっても動作するはずである。
この問題が置きそうな場所は全て、プログラムを ‘-Wconversion’ 付きで コンパイルすれば見つけることができる。引数が変換されるところで 警告を出す。
protoize
も unprotoize
も、変換されるテキストの中や
まわりにマクロ呼出しがあると混乱してしまうことがある。
言い換えると、標準的な文法による宣言や定義が、マクロ展開の
結果生じることがあってはならない。この問題は、C 言語の設計から受け継いで
いるものなので修正するのは不可能である。
マクロ呼出しにより混乱する関数が2,3個なら、手で変換すれば良い。
protooize
は、プリプロセスの条件により実際にはコンパイルされない
関数に対しては、その引数型を得ることはできない。
この場合、protoize
は、そういう関数については何の変更も
行なわない。protoize
は、そういう関数があるかどうか調べ、
あれば警告を出す。
一般的に、この問題を回避するには protoize
をちょっとずつ
何回かに分けて使えば良い。一回ごとに、異なる組の ‘-D’ オプション
を指定してコンパイルを行ない、全ての関数が変換されるまでそれを
繰り返すのである。ただし、全ての関数が変換されたことを自動的に
確認する方法はない。
そのようなコードを含むソースファイルを変換する予定がある場合は、 まず最初に、別の関数ヘッダを含むソースコードの条件付きでコンパイル される各部分を、少なくとも一つの次のトークン(関数ヘッダの最も右側の 閉じ括弧を越えて)をも含むことをまず確認する。これにより、問題を 回避できるはずである。
unprotoize
が変換するときに
混乱する可能性がある。仮引数名としてそういうものを選ぶのは避けるように
して欲しい。
This document was generated
using texi2html 1.78.