Что означает typedef с тремя аргументами? - PullRequest
6 голосов
/ 28 апреля 2020

Я пытаюсь скомпилировать код, который включает следующий заголовочный файл:

#ifndef FFT_H
#define FFT_H

#include<cmath>
#include<complex.h>
#include<vector>

#define Vec(a, b) std::vector<__typeof(*(a))> ((a), (a)+(b))

typedef double complex complex_t; // this is my trouble line!
typedef double real_t;

#endif

Мой компилятор отключается из-за typedef double complex complex_t;

Это имеет смысл для меня, потому что большинство typedefs включают только два аргумента: тип и псевдоним.

Этот опубликованный код взят из авторитетного источника , поэтому я предполагаю, что что-то не так с моей стороны. Однако я не понимаю, почему typedef будет использовать 3 аргумента.

Ответы [ 2 ]

8 голосов
/ 28 апреля 2020

Да, большинство typedefs содержат имя псевдонима и базовый тип, но нет требование, чтобы тип был единственным токеном:

typedef unsigned long long int ULLI;
//      \____________________/
//  Many tokens for underlying type

Так что все, с чем работает ваш код, появляется иметь уже тип double complex.

Этот тип фактически часть стандарта C, содержится в <complex.h>, но эквивалентный заголовок C ++ <ccomplex>/<complex.h> теперь заменен с <complex>, больше подходящим для C ++, поэтому было бы правильнее включить его и использовать тип complex<double>.

Я считаю, что с C ++ 17 <ccomplex>/<complex.h> перестал хранить любое наследие C и только что начали включать другие не унаследованные заголовки из стандартной библиотеки C ++.

А потом, в C ++ 20, они вообще отказались от него. От (слегка перефразировано) C++20 [diff.cpp17.library], который детализирует различия:

Изменение: удаление пустых заголовочных файлов C ++.

Обоснование: пустые заголовки подразумевают ложное требование для достижения C совместимость с заголовками C ++.

Эффект на исходную функцию: допустимая программа C ++ 2017, которая выполняет #include из <ccomplex> (среди прочих), может не скомпилироваться. Чтобы сохранить то же поведение, #include из <ccomplex> можно заменить на #include из <complex>.

3 голосов
/ 28 апреля 2020

complex не является ключевым словом в C ++, а double complex не является типом. Вы смешиваете C ++ с другим языком.

Вместо этого вы можете использовать std::complex<double>, с или без typedef.

...