2

Intel Math Kernel Library には、ヘッダー ファイルに次のコードが含まれています。

#ifndef MKL_Complex16
typedef
struct _MKL_Complex16 {
    double real;
    double imag;
} MKL_Complex16;
#endif

here および hereで説明されているように、この構造体定義は、ユーザーが次のように記述してオーバーライドできます。

#define MKL_Complex16 std::complex<double>

ヘッダファイルがインクルードされる前。この行でMKL_Complex16は is 'd です。これは、文字列がどこでも#defineリテラル文字に置き換えられることを意味します。std::complex<double>そうでない場合は、typedef'ed' になり、コンパイラにより多くの情報が提供されます。

これは容認できる慣行と見なされますか? Intelによって実装されているので、そうに違いないと思います。しかし、いくつかのコードをデバッグしようとすると、非常に混乱することがわかりました。

4

1 に答える 1

3

これは非常識に見えます。ビルド環境を介して実際のコードを渡すのは非常に気が進まないでしょう。どちらかといえば、より高いレベルのフラグを使用してください。

#ifndef HAVE_STD_COMPLEX
    struct MKL_Complex16 { double real; double img; };
#else
#  include <complex>
   typedef std::complex<double> MKL_Complex16;
#endif
于 2012-01-12T19:36:34.157 に答える