Считается ли приемлемой практикой иметь один и тот же идентификатор # define'd или typedef'ed в зависимости от констант времени компиляции? - PullRequest
2 голосов
/ 12 января 2012

Библиотека Intel Math Kernel содержит этот бит кода в заголовочном файле:

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

как описано здесь и обсуждено здесь , это определение структуры может быть переопределено пользователем, написав

#define MKL_Complex16 std::complex<double>

до включения заголовочного файла. В этой строке MKL_Complex16 равно #define 'd, что означает, что строка символов просто заменяется буквальными символами std::complex<double> везде. Если нет, то это typedef 'ed, что дает компилятору больше информации.

Считается ли это приемлемой практикой? Я думаю, это должно быть, так как это реализовано Intel. Но я нашел это очень запутанным, пытаясь отладить некоторый код.

1 Ответ

3 голосов
/ 12 января 2012

Это выглядит безумно. Я бы очень неохотно передавал реальный код через среду сборки Во всяком случае, используйте флаг более высокого уровня:

#ifndef HAVE_STD_COMPLEX
    struct MKL_Complex16 { double real; double img; };
#else
#  include <complex>
   typedef std::complex<double> MKL_Complex16;
#endif
...