11

次のコードは、Cで正常にコンパイルおよび実行されます(少なくとも'gcc -std = gnu99'に従って)が、C ++でのコンパイルに失敗し、「5行目:エラー:「double」を「doublecomplex」に変換できませ」初期化」。誰かが理由を知っていますか?

#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;
}

C ++で複素数を実行する別の方法があることに気付きましたが、C ++でCの複素数を使用する必要があります。これは、与えられたレガシーコードが処理を行う方法だからです。あなたが助けることができればありがとう!

4

3 に答える 3

19

C++ コンパイラは、_Complexキーワードを拡張機能としてサポートすることを選択できます (一部はサポートします) が、これは移植性がありません。移植可能な C++ ソリューションが必要な場合は、残念ながら C++ std::complex テンプレートを使用する必要があります。

幸いなことに、C++ の std::complex 数は C の複素数と互換性があることが保証されています (一方へのポインターは常に他方へのポインターに変換でき、正しいことが起こるという意味で)。つまり、 C の複雑な値を期待する C ライブラリと相互運用する必要がある場合でも、問題はありません。

C11:

各複合型には、対応する実数型の正確に 2 つの要素を含む配列型と同じ表現とアライメントの要件があります。最初の要素は複素数の実部に等しく、2 番目の要素は虚部に等しくなります。

C++11:

zが cv 型の左辺値式の場合std::complex<T>:

— 式reinterpret_cast<cv T(&)[2]>(z)は整形式でなければならない。

reinterpret_cast<cv T(&)[2]>(z)[0]の実部を指定し、z、および

reinterpret_cast<cv T(&)[2]>(z)[1]の虚部を指定するものとしzます。

于 2012-05-10T18:44:17.863 に答える
10

複合体にはCキーワードを使用します:_Complex。C ++は、complexを(テンプレート)クラスとして使用します。クリアルがどこにあるのかわからない、またはコメントを外します。

#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にライブラリの提案を追加する可能性があります。

于 2012-05-10T18:41:21.393 に答える
9

CとC++の互換性

C99のいくつかの追加は、C ++でサポートされていないか、可変個引数マクロ、複合リテラル、指定された初期化子、可変長配列、ネイティブの複素数型などのC++機能と競合します。C99で定義されているlonglongintデータ型とrestrict修飾子は、現在のC ++標準には含まれていませんが、GNUコンパイラコレクション[4]などの一部のコンパイラはそれらを拡張機能として提供します。可変個引数マクロの一部の機能を実現できる可変個引数テンプレートとともに、longlongデータ型が新しいC++標準であるC++11に存在します。一方、C99は、コメントや混合宣言やコードなどのC ++機能を組み込むことにより、他のいくつかの非互換性を減らしました。

于 2012-05-10T18:40:06.137 に答える