Oracle® Developer Studio 12.5: GCC 互換性ガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

プリプロセッサの互換性

Oracle Developer Studio C および C++ コンパイラには、デフォルトで使用される C プリプロセッサの独自のビルトイン実装があります。これらのプリプロセッサには、gcc と互換性のある次の拡張機能があります。

Oracle Developer Studio プリプロセッサ

  • #warning

  • #include_next (ラッパーヘッダーを実装する)

プリプロセッサの従来モードの動作に依存する一部のコードも、Oracle Developer Studio コンパイラと GCC コンパイラの相違点に遭遇します。gcc の従来モードは、https://gcc.gnu.org/onlinedocs/cpp/Traditional-Mode.html に記載されています。

Oracle Solaris 上で /usr/lib/cpp を使用する従来の動作が必要な場合はその動作を実現できますが、ベストプラクティスは、それらの依存関係をより最新の使用法に置き換えることです。/usr/lib/cpp は、gcc と完全に互換性のあるプリプロセッサとなることを意図したものではありません。

次に示す例は、ソースコードにしばしば見られるものです。

使用例 1  空のコメントを使用したトークンの結合
FOO/**/BAR

期待される結果は「FOOBAR」という出力です。これは、従来のモードを有効にする特別な手順を実行しないかぎり、gcc または Oracle Developer Studio のいずれかで動作しません。Oracle Developer Studio C では、これは –Xs オプションを指定することを意味します。gcc では、–traditional-cpp オプションを指定する必要があります。C および C++ で定義されている標準のトークン結合演算子 ## を使用するようにコードを更新することをお勧めします。

使用例 2  トークン間のスペース
#define FOO foo
#define BAR bar
FOO-BAR

ここで期待される結果は「FOO-BAR」で、「FOO - BAR」ではありません。プリプロセッサは「-」記号の前後に空白を追加する場合もあれば、そうしない場合もあります。gcc コンパイラは空白を追加せず、一部のコードは、–E または –P オプションを使用してコンパイラをプリプロセッサとして使用するときに、その動作に依存します。従来の動作を取得するために、Oracle Developer Studio C コンパイラで –Xs を使用するか (Oracle Developer Studio C++ ではサポートされません)、または /usr/lib/cpp を直接使用できます。