須藤です。 今日、Subversionの人たちにRubyバインディングがビルドできない と言われて気付いたのですが、GCCの-ansiオプションをつけると拡 張ライブラリがビルドできません。 特に「-ansiオプションをつけてもビルドできるべき」とかいうので はなく、-ansiオプションをつけてもビルドできるようにしたいの かどうかが気になったのでこれを書いています。 (1.8.xはまだ引数宣言にK&Rも使っていたりして、ポータブルな書 き方を意識しているようにも見えるので) 手元の日本語のGCCのmanには以下のように書いていて、ruby.hの 「inline」がひっかかっていました。 (inlineは1.8.xにも1.9.xにもあります) > -ansi 全ての ANSI 標準の C プログラムをサポートします。 > > このオプションは、GNU C が持つ ANSI C との非互換な機能を全て 排 > 除 します。例えば、asm, inline, typeof などのキーワードや、unix > や vax などの現在使用しているシステムを規定する定義済みマクロな > ど が抑制されます。さらに、好ましくなくかつほとんど使用されない > ANSI のトライグラフの機能を使用可能とし、さらに ‘$’ を識別子 の > 一部として使用できないようにします。 > > 代替キーワードである__asm__, __extension__, __inline__, __type‐ > of__ は、 ‘-ansi’ が指定された場合でも使用することが可能です 。 > も ちろん、これらを ANSI C プログラムで使用することが望ましくな > いのは当然ですが、‘-ansi’ をつけてコンパイルされる場合でも、 イ > ン クルードされるヘッダファイル中にこれらが記述できるということ > は有用です。 __unix__ や __vax__ などの代替定義済みマクロ は 、 > ‘-ansi’ を指定する場合でも指定しない場合でも、利用可能となって > います。 > > ‘-ansi’ オプションは、ANSI 準拠でないプログラムを不必要に拒否す > る こ と は あ りません。もしこのような動作を行なわせたい場合に > は‘-ansi’に加えて‘-pedantic’オプションを指定する必要があります。 > > プ リプロセッサ定義済みマクロ __STRICT_ANSI__ が ‘-ansi’ オプシ > ョンを使用した際には定義されます。いくつかのヘッダファイルは 、 > このマクロを識別して、ANSI 標準が望まない関数やマクロの定義を抑 > 制します。これは、それらの関数やマクロと同じ名前を別の目的で 使 > 用するプログラムを混乱させないようにするためです。