Вопрос по c++ – Сложные числа в C ++?

11

Следующий код компилируется и прекрасно работает на C (по крайней мере, в соответствии с «gcc -std = gnu99»), но он не может скомпилироваться в C ++, давая «строку 5: ошибка: невозможно преобразовать» double ». в два разаcomplex& APOS; в инициализации & quot ;. Кто-нибудь знает почему?

<code>#include "/usr/include/complex.h"
#include <stdio.h>

int main(int argc, char * argv[]) {
  double complex a = 3;  // ERROR ON THIS LINE
  printf("%lf\n", creal(a));
  return 0;
}
</code>

Я понимаю, что есть еще один способ создания комплексных чисел в C ++, но я должен использовать комплексные числа C в C ++, потому что именно так унаследованный код работает. Спасибо, если вы можете помочь!

Но действительно,why не хотите использоватьstd::complex<>? ildjarn
ildjarn: К сожалению, библиотека, с которой я работаю, использует комплексные числа C99 в C ++. Кажется неуместным начинать проект таким образом, но это код, с которым мне приходится работать. Мартиньо: это правда. Я должен был сделать тест с -std = c99 iloveponies
FTR,-std=gnu99 на самом деле это не тот флаг, за который вы хотитеC, Это "С" с вещами, которые, как думал GNU, было бы хорошей идеей, но независимо от того, подойдет ли оно для интерпретации ".-std=c99 желательно если хочешьC. R. Martinho Fernandes

Ваш Ответ

3   ответа
9

Совместимость C и C ++

Several additions of C99 are not supported in C++ or conflict with C++ features, such as variadic macros, compound literals, designated initializers, variable-length arrays, and native complex-number types. The long long int datatype and restrict qualifier defined in C99 are not included in the current C++ standard, but some compilers such as the GNU Compiler Collection[4] provide them as an extension. The long long datatype along with variadic templates, with which some functionality of variadic macros can be achieved, are present in the new C++ standard, C++11. On the other hand, C99 has reduced some other incompatibilities by incorporating C++ features such as // comments and mixed declarations and code.

9

Используйте ключевое слово C для сложных: _Complex. C ++ использует сложный класс (шаблон). Я не уверен, где находится креал, или я бы раскомментировал это.

#include <complex.h>
#include <cstdio>

int main(int argc, char * argv[]) {
  double _Complex a = 3.0 + 0.0I;  // DECLARATION WORKS NOW - NOTE ASSIGNMENT MUST HAVE IMAG PART
  //printf("%lf\n", creal(a));
  return 0;
}

Это работает в gcc (я скомпилировал с g ++). Я получил предупреждение об устаревших .h заголовках.

Вот это ссылка на электронный трейл, показывающий нестандартную совместимость с C ++ и C с комплексными числами. C ++ 11 требует совместимости компоновки комплексов C ++ с C _Complexes.

В настоящее время я изучаю креал и т. Д. На C ++. Я не нахожу ничего в стандарте. Поскольку, похоже, предпринимаются некоторые усилия для обеспечения некоторой совместимости исходного кода между C ++ и C, тогда creal, cpow и т. Д. Могут стать хорошим дополнением к TR2 предложениям библиотеки.

Error: User Rate Limit Exceededstd::complex<>Error: User Rate Limit Exceeded<complex.h>Error: User Rate Limit Exceededstd::complex).
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededunable to find numeric literal operator ‘operator"" IError: User Rate Limit Exceededg++Error: User Rate Limit Exceededg++Error: User Rate Limit Exceeded_Complex_IError: User Rate Limit Exceededg++.
Error: User Rate Limit Exceeded iloveponies
Error: User Rate Limit Exceededstd::complex<double> z; static_cast<double(&)[2]>(z)Error: User Rate Limit Exceeded
17

Компилятор C ++ может выбрать поддержку_Complex ключевое слово как расширение (и некоторые делают), но это не переносимо. Если вы хотите иметь переносимое решение C ++, вам, к сожалению, нужно использовать шаблоны C ++ std :: complex.

Хорошей новостью является то, что C ++ std :: комплексные числа гарантированно будут совместимы с комплексными числами C (в том смысле, что указатель на одно всегда может быть преобразован в указатель на другое, и это произойдет правильно), что означает что если вам нужно взаимодействовать с библиотекой C, которая ожидает сложные значения C, у вас не возникнет никаких проблем.

C11:

Each complex type has the same representation and alignment requirements as an array type containing exactly two elements of the corresponding real type; the first element is equal to the real part, and the second element to the imaginary part, of the complex number.

C ++ 11:

If z is an lvalue expression of type cv std::complex<T> then:

— the expression reinterpret_cast<cv T(&)[2]>(z) shall be well-formed,

reinterpret_cast<cv T(&)[2]>(z)[0] shall designate the real part of z, and

reinterpret_cast<cv T(&)[2]>(z)[1] shall designate the imaginary part of z.

Error: User Rate Limit Exceededstackoverflow.com/a/10540288/2189128Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededzError: User Rate Limit Exceededcomplex<T>Error: User Rate Limit Exceededreinterpret_cast<cv T(&)[2]>(z) , reinterpret_cast<cv T(&)[2]>(z)[0]Error: User Rate Limit ExceededzError: User Rate Limit Exceededreinterpret_cast<cv T(&)[2]>(z)[1]Error: User Rate Limit ExceededzError: User Rate Limit ExceededaError: User Rate Limit Exceededcomplex<T>*Error: User Rate Limit Exceededa[i]Error: User Rate Limit ExceedediError: User Rate Limit Exceededreinterpret_cast<cv T*>(a)[2*i]Error: User Rate Limit Exceededa[i]Error: User Rate Limit Exceededreinterpret_cast<cv T*>(a)[2*i + 1]Error: User Rate Limit Exceededa[i].

Похожие вопросы