Типы _Complex в C99 ведут себя как std :: complex <> в C ++? - PullRequest
2 голосов
/ 07 апреля 2019

Я недавно заметил существование типов для комплексных значений в C99 (после того, как они отметили макросы их построения как особенность C11).

Поскольку это C, они построеныв типах, а не в структурах с перегруженными операторами и т. д. Но - это правда или нет, я могу рассматривать их так, как если бы они основывались на шаблоне std::complex в C ++?i..e.float _Complex фактически совпадает с std::complex<float> и double _Complex с std::complex<double>?

Примечание: Конечно, они ведут себя точно так же, поскольку в C ++ есть функции, которых нет в C, но мы думаем об этом, как будто мы ограничиваемся "подмножеством C", за исключением этих двух типов.

Если они не фактически одинаковы - пожалуйста, объясните, чем они отличаются.

1 Ответ

3 голосов
/ 07 апреля 2019

std::complex отличается от _Complex главным образом своим интерфейсом.

Чтобы получить действительную часть std::complex, вы используете constexpr T real() const функцию-член, то же самое для _Complex типов требует creal макрос.

Так что они не одного типа, и им будет трудно притвориться, что они есть, но у них одинаковая внутренняя компоновка.

C ++ 17 29.5.4 состояния:

Если z является lvalue-выражением типа cv complex, тогда:

  • выражение reinterpret_cast<cv T(&)[2]>(z) должно быть правильно сформировано,
  • reinterpret_cast<cv T(&)[2]>(z)[0] обозначает действительную часть z, а
  • reinterpret_cast<cv T(&)[2]>(z)[1] обозначает мнимую часть z.

Более того, если a является выражением типа cv complex<T>* и выражение a[i] четко определено для целочисленного выражения i, то:

  • reinterpret_cast<cv T*>(a)[2*i] обозначает действительную часть a[i], а
  • reinterpret_cast<cv T*>(a)[2*i + 1] обозначает мнимую часть a[i].

и C18 6.2.5.13 состояния:

Каждый сложный тип имеет одинаковое представление и выравнивание требования как тип массива, содержащий ровно два элемента соответствующий реальный тип; первый элемент равен реальной части, и второй элемент мнимой части комплексного числа.

Это означает, что вы можете использовать std::complex<T> и _Complex T для написания совместимого кода для C и C ++.

Примечание: _Complex был представлен в C99.

...