2012-01-12 2 views
2

Процессор Intel Math Kernel Library содержит этот бит кода в файле заголовка:Является ли приемлемой практикой наличие одного и того же идентификатора # define'd или typedef'ed, в зависимости от констант времени компиляции?

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

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

#define MKL_Complex16 std::complex<double> 

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

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

+1

Почему typedef дает компилятору «больше информации»? – Mat

+3

Почему загадочное сочетание C-style strypedefs и C++? –

+1

@KerrekSB: библиотека поддерживает как C, так и C++, видимо, – Mat

ответ

3

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

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