#pragma complexgcc ディレクティブは、複雑な数学関数を呼び出すときに、コンパイラーに対してパラメーターの渡し方を命令します。
ここで、サブオプションでは以下が行われます。
on -qfloat=complexgcc をスタックにプッシュします。このサブオプションは、複雑なパラメーターを渡したり、戻したりするときに、GCC 規則を使用するようにコンパイラーに指示します。 off -qfloat=nocomplexgcc をスタックにプッシュします。このサブオプションは、複雑なパラメーターを渡したり、戻したりするときに、AIX 規則を使用するようにコンパイラーに指示します。 pop スタックから現在の設定を除去し、直前の設定を復元します。スタックが空のときは、コンパイラーは -qfloat=[no]complexgcc 設定がコマンド行に指定されていることを想定し、指定されていないと、-qfloat=[no]complexgcc にはコンパイラーのデフォルトが使用されます。
このプラグマの現行設定は、設定が有効である間に宣言または定義された関数にのみ影響します。これは、それ以外の関数には影響しません。
関数に対するポインターから関数を呼び出すと、-qfloat=[no]complexgcc コンパイラー・オプションによって、必ず規則設定が使用されます。コンパイラーを呼び出すときに、このオプションがコマンド行に明示的に設定されていないと、このオプションについてのコンパイラーのデフォルトが使用されます。複合値を渡す関数を値またはリターン複合値でミックス・アンド・マッチさせると、エラーが発生します。
例えば以下のコードが -qfloat=nocomplexgcc でコンパイルされるとします。
#pragma complexgcc(on) void p (_Complex double x) {} #pragma complexgcc(pop) typedef void (*fcnptr) (_Complex double); int main() { fcnptr ptr = p; /* error: function pointer is -qfloat=nocomplexgcc; function is -qfloat=complexgcc */ }