簡體   English   中英

C++中的C復數?

[英]C Complex Numbers in C++?

以下代碼在 C 中編譯並運行得很好(至少根據 'gcc -std=gnu99'),但在 C++ 下無法編譯,給出“第 5 行:錯誤:無法將 'double' 轉換為 'double complex ' in初始化”。 有人知道為什么嗎?

#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 復數,因為這就是給我的遺留代碼如何做事。 如果你能幫忙,謝謝!

C++ 編譯器可以選擇支持_Complex關鍵字作為擴展(並且有一些支持),但這不是可移植的。 不幸的是,如果你想要一個可移植的 C++ 解決方案,你需要使用 C++ std::complex 模板。

好消息是 C++ std::complex numbers 保證與 C 復數兼容(從某種意義上說,指向一個的指針總是可以轉換為指向另一個的指針,並且正確的事情會發生),這意味着如果您需要與需要 C 復數值的 C 庫進行互操作,則不會有任何麻煩。

C11:

每個復數類型與包含對應實數類型的兩個元素的數組類型具有相同的表示和對齊要求; 第一個元素等於復數的實部,第二個元素等於復數的虛部。

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的虛部。

使用 C 關鍵字表示復雜:_Complex。 C++ 使用 complex 作為(模板)類。 我不確定 Creal 在哪里,否則我會取消注釋。

#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++ 中的 Creal 等。 我沒有在標准中找到任何東西。 由於似乎有一些努力來提供 C++ 和 C 之間的某些源代碼兼容性,因此 creal、cpow 等可能會對 TR2 庫提案做出很好的補充。

C 和 C++ 的兼容性

C++ 不支持 C99 的一些添加或與 C++ 功能沖突,例如可變參數宏、復合文字、指定初始值設定項、可變長度數組和本機復數類型 C99 中定義的 long long int 數據類型和限制限定符未包含在當前的 C++ 標准中,但一些編譯器(例如 GNU Compiler Collection[4])將它們作為擴展提供。 新的 C++ 標准 C++11 中提供了 long long 數據類型和可變參數模板,通過這些模板可以實現可變參數宏的某些功能。 另一方面,C99 通過合並 C++ 特性(例如 // 注釋以及混合聲明和代碼)減少了其他一些不兼容性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM