コンパイラの互換性
このセクションでは、Oracle Developer Studio と GCC の間の互換性に影響を与えるコンパイラ機能とその他の動作について説明します。
処理系定義の動作
C および C++ の規格の一部は、「処理系定義の動作」になっています。これらの詳細は GCC および Oracle Developer Studio のドキュメントに定義されており、いくつかの点で異なっています。
ビットフィールドと列挙型の両方が、コンパイラの選択によって符号付きまたは符号なしになることがあります。enum の場合、この選択は、列挙された値のリストに基づいて異なる可能性があります。Oracle Developer Studio C および C++ の動作は gcc の動作と異なります。
符号付きおよび符号なしの int ビットフィールド
int (signed int または unsigned int ではない) として宣言されたビットフィールドは、コンパイラによって、符号付きまたは符号なしのいずれかの型を使用して実装される可能性があります。これにより、値を抽出するときに違いが生じ、符号拡張するかどうかの決定にも違いが生じます。
Oracle Developer Studio コンパイラは int ビットフィールドに符号なしの型を使用し、gcc コンパイラは符号付きの型を使用します。この動作を制御するには、gcc –funsigned-bitfields フラグを使用します。
詳細については、https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Non_002dbugs.html の 6 番目のリスト項目を参照してください。
符号付きまたは符号なしの enum 型
C および C++ の enum 型は、コンパイラによって、符号付きまたは符号なしのいずれかの型を使用して実装される可能性があります。これは特定の型の列挙値に依存することがあるため、予測がさらに困難です。Oracle Developer Studio コンパイラの動作はこの点で、gcc と異なっています。Oracle Developer Studio コンパイラは enum に対して符号付きの値を使用し、gcc コンパイラは enum 型の一部の値に明示的に負の値が代入されていないかぎり、符号なしの型を使用します。
enum 型として宣言されているビットフィールド間の実装の差異を理解することは、(今のところは) 読者による練習に頼っています。移植性を高めるようにソースコードを更新することをお勧めします。ビットフィールドについては、コードがどのように記述されているかに応じて、単純に「int」宣言を「signed」または「unsigned」のいずれかに更新します。enum 型の場合、型を整数型に変換するときは型をキャストするようにし、そのデフォルトの型に依存しないようにします。
C 言語の拡張
Oracle Developer Studio の C 言語の多くの拡張は Oracle Developer Studio C++ でも実装されます。C 言語の一部の拡張については、Oracle Developer Studio 12.5: C ユーザーズガイド の 拡張機能に記載されています。gcc 言語の拡張のリストについては、GCC ドキュメントのC 言語ファミリの拡張についてのセクションを参照してください。
gcc テーブルに一覧表示されている項目の一部は、現在は関連する言語規格の標準機能で、表 1に C11、C99、C++03、C++11、および C++14 として一覧が記載されています。
新しい言語規格の機能は、その機能が既存のコードと競合するか、厳密な準拠モードを有効にするオプションを使用する場合を除き、古い言語規格によってコンパイルするときに拡張として利用できることがあります。さまざまなモードで使用可能な機能の詳細については、そのコンパイラのドキュメントを参照してください。
次の表に、Oracle Developer Studio で実装されている拡張機能の一覧を示します。
表 1 Oracle Developer Studio で実装される GCC の拡張
|
|
文の式: 文および宣言を式の内側に入れます。
|
実装されています。
|
ローカルラベル: ブロックに対するローカルなラベル。
|
C でのみ実装されています。
|
値としてのラベル: ラベルへのポインタの取得と計算された gotos。
|
C でのみ実装されています。
|
入れ子になった関数: Algol や Pascal のような関数の字句範囲。
|
実装されていません。
|
構築呼び出し: 別の関数の呼び出しをディスパッチします。
|
実装されていません。
|
typeof: 式のタイプを示しています。
|
実装されています。Oracle Developer Studio 12.5 C++ の新機能。C++11 はこのための decltype を定義します。Sun (–compat=5) モードでは、C++ は typeof キーワードを省略しますが、__typeof および __typeof__ は引き続きサポートしています。
|
条件式: 「?:」式の中間のオペランドを省略します。
|
C でのみ実装されています。
|
__int128: 128 ビット整数—__int128。
|
実装されていません。
|
Long Long: ダブルワード整数 —long long int。
|
C および C++ で実装されています。
|
Complex: 複素数を表すデータ型。
|
型指定のない _Complex は gcc との互換性のためにデフォルトで double に指定されます。C でのみ実装されています。
|
浮動小数点型: 追加の浮動小数点型。
|
Oracle Developer Studio C および C++ は 128 ビットの long double 型を実装しますが、__float128 という名前の型を使用しません。
|
半精度: 半精度浮動小数点型。
|
実装されていません。
|
10 進浮動小数点: 10 進浮動小数点型。
|
実装されていません。
|
16 進浮動小数点: 16 進浮動小数点定数。
|
C99.C でのみ実装されています。
|
固定小数点: 固定小数点型。
|
実装されていません。
|
名前付きアドレス空間: 名前付きアドレス空間。
|
実装されていません。
|
長さゼロ: 長さゼロの配列 (一般的なゼロ長配列)。
|
int foo[0];
C++ で GNU 互換モード、または –features=zla で実装されています。
|
長さゼロ: 長さゼロの配列 (柔軟な配列のメンバー)。
|
int foo[]; // 構造体の末尾
C++ で GNU 互換モード、または –features=zla で実装されています。
|
空の構造体: メンバーを含まない構造体。
|
実装されています。C の場合は –features=extensions が必要です。
|
変数長: 長さが実行時に計算される配列。
|
C99.C および C++ で実装されています。
|
可変個引数マクロ: 可変数の引数をとるマクロ
|
C99.C および C++ で実装されています。Oracle Developer Studio は可変マクロ引数用のユーザー定義名を指定するための gcc 拡張を実装します。欠落した可変引数のための gcc 拡張は C++ に実装されていません。
|
エスケープされた改行: エスケープされた改行の規則が若干緩やかです。
|
実装されていません。
|
添字の指定: すべての配列は lvalue でない場合でも添字を指定できます。
|
C99.標準の C++。C および C++ で実装されています。
|
ポインタ演算: void ポインタおよび関数ポインタの演算。
|
C でのみ実装されています。警告が生成されます。
|
配列へのポインタ: 修飾子を使用した配列へのポインタが予期したとおりに動作します。
|
実装されていません。
|
初期化子: 非定数の初期化子。
|
C99.標準の C++。実装されています。
|
複合リテラル: 複合リテラルは構造体、共用体、または配列を値として与えます。
|
C99.C で実装されています。
|
指示付き初期化子: 初期化子のラベル要素。
|
C99.C で実装されています。
|
case の範囲: `case 1 ... 9` など。
|
実装されています。
|
共用体へのキャスト: 共用体のメンバーから union 型へのキャスト。
|
実装されていません。
|
宣言の混在: 型宣言とコードの混在。
|
C99.標準の C++。実装されています。
|
属性の拡張
|
認識されている属性をテストするために __has_attribute() を使用できます。詳細については、 属性を参照してください。
|
関数プロトタイプ: プロトタイプ宣言と古い形式の定義。
|
C でのみ実装されています。C++ に関係ありません。
|
C++ コメント: 認識されません。
|
C で実装されています。
|
ドル記号: 識別子でドル記号を使用できます。
|
実装されています。–features=iddollar が必要です。
|
文字エスケープ: 「\e」が文字 <ESC> を表します。
|
実装されていません。
|
整列: 型または変数の整列について照会します。
|
C11 では _Alignof とスペルします。__alignof__ は C および C++ でサポートされます。C++ は alignof を C++11 モードでサポートします。
|
インライン化: インライン関数の定義 (マクロと同様の速さ)。
|
C99 および標準の C++。実装されています。GCC はこの規格を実装する前は、外部の関数本体の代わりに静的な関数本体を作成していました。コードがこれに依存する場合は、C オプション –features=no%extinl を使用して、Oracle Developer Studio C コンパイラから類似の動作を取得できます。
|
Volatile: volatile オブジェクトへのアクセスを構成するもの。
|
実装されています。GCC と互換性があります。
|
C とアセンブリ言語の使用: C とアセンブラをインタフェースするための命令と拡張。
|
実装されています。C および C++ は、制約、asm() ラベル、明示的なレジスタ変数などの gcc 互換の asm() ステートメントを実装します。
|
別のキーワード: ヘッダーファイルについては __const__、__asm__ など。
|
実装されています。Oracle Developer Studio 12.5 C++ は __asm および __volatile キーワード記法を追加しました。
|
不完全な列挙型: enum foo;、後で定義。
|
C++11。C および C++ で実装されています。C++11 モードである必要があります。
|
関数名: 現在の関数の名前である出力可能文字列。
|
Oracle Developer Studio コンパイラは __func____FUNCTION__ および __PRETTY_FUNCTION__ をサポートします。
|
戻りアドレス: 関数の戻りアドレスまたはフレームアドレスを取得します。
|
実装されていません。
|
ベクトル拡張: 組み込み関数を介してベクトル命令を使用します。
|
|
offsetof: offsetof を実装するための特殊構文。
|
実装されていません。
|
__sync 組み込み型: 不可分メモリーアクセス用のレガシー組み込み関数。
|
実装されています。 –xatomic=studio を使用します。 不可分機能を参照してください。( gcc では標準の __atomic 組み込み型が推奨されるため、これらの関数が非推奨とされました。)
|
__atomic 組み込み型: メモリーモデルを持つ不可分組み込み関数。
|
実装されています。Oracle Developer Studio 12.5 の新機能。 –xatomic=studio を使用します。 不可分機能を参照してください。
|
整数オーバーフロー組み込み関数: 演算および演算オーバーフロー検査を実行する組み込み関数。
|
実装されていません。
|
トランザクションメモリーのための x86 特定メモリーモデル拡張: x86 メモリーモデル。
|
実装されていません。
|
オブジェクトサイズ検査: 制限されたバッファーオーバーフロー検査のための組み込み関数。
|
実装されていません。
|
ポインタ境界チェッカー組み込み関数: ポインタ境界チェッカー用の組み込み関数。
|
実装されていません。
|
Cilk Plus 組み込み関数: Cilk Plus 言語拡張用の組み込み関数。
|
実装されていません。
|
その他の組み込み関数: ほかの組み込み関数。
|
__builtin_constant_p() は、コンパイル時の定数かどうかをテストできます。その他のほとんどの組み込み関数は、Oracle Developer Studio によって実装されていません。
|
ターゲット組み込み関数: 特定のターゲットに固有の組み込み関数。
|
実装されていません。
|
ターゲット形式の検査: 特定のターゲットに固有の形式の検査。
|
実装されていません。
|
プラグマ: gcc によって受け入れられるプラグマ。
|
#pragma once が実装されています。その他は実装されていません。
|
名前なしフィールド: 構造体/共用体の内部の名前のない構造体/共用体フィールド。
|
C++11。C および C++ で実装されています。
|
スレッドローカル: スレッドごとの変数。
|
C99.C++11。C および C++ で実装されています。
|
2 進定数:「0b」接頭辞を使用した 2 進定数。
|
C++ でのみ実装されています。
|
|
SIMD ベクトルのサポート
Oracle Developer Studio は、CPU 固有の命令を使用してベクトル演算をエンコードする一部のアーキテクチャー固有の組み込み関数をサポートしています。これらのデータ型は、vector_size 属性を使用するか、またはヘッダーファイルの互換性に説明されているような適切なヘッダーファイルを含めることによって作成されます。一部の C 演算子はそのような型でサポートされますが、場合によっては CPU 固有の組み込み関数の使用が必要なこともあります。
_m128 などの型とそれらの演算については、Oracle Developer Studio 12.5: C ユーザーズガイド の SIMD 組み込み関数の SPARC64 X についてのセクションを参照してください。
C++ 固有の機能
Oracle Developer Studio C++ コンパイラは、__cplusplus マクロの非標準の値を、その設定を必要とするソースコードに対して有効にする –features=cplusplus_redef オプションをサポートします。Oracle Developer Studio 12.5: C++ ユーザーズガイド の –xrestrict[=f]を参照してください。
C++ 用のその他の GNU 拡張は次のとおりです。
-
列挙型の long long 定数
-
関数パラメータとして void の typedef を許可
-
typedef void VOID;
int foo(VOID);
-
_Bool - <stdbool.h> がインクルードされた場合の Oracle Linux の bool と同等です
-
extern テンプレート
-
long long ビットフィールド
-
pragma パックのプッシュ/ポップ
C++ の拡張については、GCC ドキュメントのC++ 言語の拡張に関するセクションを参照してください。Oracle Developer Studio コンパイラ内のこれと同じ機能については、次の表から見つけることができます。
表 2 GNU C++ の拡張
|
|
C++ Volatile: volatile オブジェクトへのアクセス方法を決定します。
|
互換性のある実装。
|
制限付きポインタ: C99 制限付きポインタと参照。
|
実装されています。
|
あいまいなリンク: G++ がインラインや仮想テーブルなどを配置する場所。
|
Oracle Developer Studio はこれらに対し、おそらく若干違った方法で COMDAT を使用します。
|
C++ インタフェース: 単一の C++ ヘッダーファイルを宣言と定義の両方に使用できます。
|
実装されていません。gcc で非推奨になりました。
|
テンプレートのインスタンス化: 必要なテンプレートのインスタンス化のコピーがそれぞれ 1 つだけ出力されることを確認するための方法。
|
Oracle Developer Studio はこれらに対し、おそらく若干違った方法で COMDAT を使用します。
|
バインドメンバー関数: 「->*」や「.*」式で示すメソッドへの関数ポインタを抽出できます。
|
実装されていません。
|
C++ 属性: C++ 専用の変数、関数、および型属性。
|
|
関数の複数バージョン化: 複数の関数バージョンを宣言します。
|
実装されていません。
|
名前空間の関連付け: 名前空間の関連付けのためによく使われるディレクティブ。
|
実装されていません。gcc では標準の C++11 機能が推奨されるため、非推奨になりました。
|
型特性: 型特性のためのコンパイラサポート。
|
実装されていません。
|
C++ の概念: 一般的なプログラミングのためのサポートの改善。
|
実装されていません。
|
Java 例外: Java を操作するための例外処理の調整。
|
実装されていません。
|
非推奨の機能: C++ から除去される予定の機能。
|
実装されていません。
|
下位互換性: C++ の以前の定義との互換性。
|
実装されていません。
|
|
属性
Oracle Developer Studio 12.5 コンパイラで実装されている属性の完全なドキュメントは、Oracle Developer Studio 12.5: C ユーザーズガイド の サポートされる属性およびOracle Developer Studio 12.5: C++ ユーザーズガイド の サポートされる属性にあります。
__has_attribute() 組み込み型は、認識されている属性をテストするために gcc および Oracle Developer Studio の両方のコンパイラで使用できます。
Oracle Developer Studio 12.5 C++ の新しい属性は、aligned、deprecated、weak(alias)、weakref、packed、tls_model、vector_size、および visibility です。
Oracle Developer Studio コンパイラは、属性についてのすべての構文をサポートするわけではありません。
表 3 GCC 属性
|
|
関数属性: 関数に副次的影響がないこと、または関数が復帰しないことを宣言します。
|
alias、aligned、always_inline、const、constructor / destructor、deprecated (C++14)、malloc、noinline、noreturn、nothrow (C++ のみ)、pure、returns_twice、visibility、weak (および alias)、weakref (C++)
|
変数属性: 変数の属性を指定します。
|
aligned、deprecated、mode (C++)、packed (部分的な実装)、tls_model、vector_size、weak
|
型属性: 型の属性を指定します。
|
aligned、deprecated、packed、visibility
|
列挙子属性: 列挙子の属性を指定します。
|
deprecated
|
|
コマンド行オプション
Oracle Developer Studio と gcc の両方のコンパイラは、–g、–c、–o などの多くの従来のコンパイラオプションを実装します。次の表では、特に gcc との互換性を持つように実装されている Oracle Developer Studio コンパイラのオプションについて説明します。
Oracle Developer Studio の次のオプションは、gcc と互換性があります。
表 4 互換性のあるオプション
|
|
–std
|
–std オプションは、C11 や C++11 などの言語規格を選択します。
|
–pedantic
|
通常なら受け入れられる標準の技術的な違反に関するエラーまたは警告を発行します。このオプションは Oracle Developer Studio 12.5 C++ コンパイラの新しいオプションです。
|
–m32 / –m64
|
32 ビットまたは 64 ビットのバイナリ出力を選択します。
|
–shared
|
共有ライブラリを生成します。Oracle Solaris Studio 12.4 では、 –sharedオプションは –G の別名のように機能していました。Oracle Developer Studio 12.5 では、このオプションは gcc の –shared オプションのように機能します。 表 5を参照してください。
|
|
次のオプションは Oracle Developer Studio と GCC の間で動作が異なります。
表 5 違いがあるオプション
|
|
|
–xM
|
–M
|
ソースファイルについての make 形式の依存関係を出力します。gcc では、–xM は別の機能を実行します。Oracle Developer Studio では、–M はリンカーのマップファイルを選択します。
|
–B(static| dynamic)
|
–Wl,–B(static| dynamic)
|
GNU リンカーはこの動作をサポートしますが、gcc はサポートしません。オプションを GNU ld に渡すには、–Wl を使用します。gcc では、–B は別の機能を実行します。
|
–G
|
–shared
|
共有ライブラリを生成するときに、gcc 内で –shared を指定すると、C++ ライブラリの依存関係が追加されます。Oracle Developer Studio コンパイラで –G オプションを指定しても、この依存関係は追加されません。
|
|
次の gcc 形式のオプションは、Oracle Developer Studio の対応するオプションに自動的に変換されます。このオプションのリストは、このオプション –xhelp=gccflags を C または C++ コンパイラに渡すことで表示されます。
表 6 自動変換されるオプション
|
|
–MM
|
–xM1 と同じ
|
–Ofast
|
–fast と同じ
|
–Wall
|
+w2 と同じ (C++ のみ)
|
–Wall
|
–v と同じ (C のみ)
|
–Werror
|
–errwarn=%all と同じ
|
–Wpedantic
|
–pedantic と同じ
|
–fno-elimininate-unused-debug-types
|
受け入れて無視
|
–fopenmp
|
–xopenmp と同じ
|
–fPIC
|
–KPIC と同じ
|
–fpic
|
–Kpic と同じ
|
–fplan9-extensions
|
受け入れて無視 (C のみ)。
|
–fplugin-arg-name=t
|
警告と無視 (C のみ)
|
–fplugin=t
|
警告と無視 (C のみ)
|
–fsigned-char
|
–xchar=signed と同じ (C のみ)
|
–fsyntax-only
|
–xe と同じ
|
–funsigned-char
|
–xchar=unsigned と同じ (C のみ)
|
–gdwarf-version
|
–xdebugformat=dwarf と同じ
|
–gstabs
|
–xdebugformat=stabs と同じ
|
–gstabs+
|
–xdebugformat=stabs の使用が推奨されます。オプションは無視されます
|
–iplugindir=t
|
警告と無視
|
–march=a
|
–xtarget=a と同じ
|
–mcpu=a
|
–xtarget=a と同じ
|
–mfmaf
|
–fma=fused と同じ
|
–mno-vis
|
–xvis=no と同じ
|
–mno-vis2
|
–xvis=no と同じ
|
–mno-vis3
|
–xvis=no と同じ
|
–mtune=a
|
–xtarget=a と同じ
|
–mvis
|
–xvis と同じ
|
–mvis2
|
–xvis と同じ
|
–mvis3
|
–xvis と同じ
|
–no-canonical-prefixes
|
受け入れて無視
|
–no-fma
|
–fma=none と同じ
|
–no-fmaf
|
–fma=none と同じ
|
–no-trigraphs
|
–xtrigraphs=no と同じ
|
–nodefaultlibs
|
–xnolib と同じ (C++ のみ)
|
–pass-exit-codes
|
警告と無視
|
–pedantic-errors
|
–pedantic と同じ
|
–pipe
|
警告と無視
|
–save-temps
|
–keeptmp と同じ
|
–shared
|
–G と同じ
|
–specs=t
|
警告と無視
|
–traditional
|
–Xs と同じ (C のみ)
|
–trigraphs
|
–xtrigraphs=yes と同じ
|
|