Поскольку препроцессор работает на основе токенов, а X_x
считается одним токеном, следовательно, #define
игнорирует его.Если вам нужно X_x
, чтобы стать REPLACEDx()
, используйте sed или любой другой regexer для предварительной обработки кода.
Поскольку макросы глупы, самоанализ аргументов невозможен, поэтому вы не можете сделать `#define fft_func(mytype Если вы хотите сделать этот эффект без регулярных выражений, используйте
#define CONCAT2(x, y) x##y
#define CONCAT(x, y) CONCAT2(x, y)
#define FFTW_FUNC(fft_type, fft_func) CONCAT(CONCAT(CONCAT(fftw, fft_type), _), fft_func)
int main() {
// ...
FFTW_FUNC(type, func)(args);
// ...
}
Для типов FFT:
#define FFTWT_FLOAT f
#define FFTWT_DOUBLE
#define FFTWT_LONG_DOUBLE l
#define FFTWT_QUAD_PRECISION q