1

私のMacOSXシステムにはいくつかの異なるバージョンのヘッダーファイルcomplex.hがあるようで、それらは互換性がありません。

  • /usr/include/complex.h_Complex数値のC99実装を定義し、
  • /usr/include/c++/4.2.1/backward/complex.hは、数値.hのC++実装を定義する。なしのC++ヘッダーの薄いラッパーです。std::complex

私の問題は、C99複素数を使用してコンパイルされたCライブラリがあり、それに対してC++プログラムをリンクする必要があることです。ただし、インクルードファイルの参照<complex.h>であり、プログラムをコンパイルするときに、g++は代わりにC++の下位互換性ヘッダーを取得し、すべての地獄が解き放たれます。

g ++にフラグを渡そうとしました-I/usr/includeが、役に立ちませんでした。

インクルードするときにg++にC++ヘッダーの代わりにCヘッダーを使用させるにはどうすればよい<complex.h>ですか?

4

4 に答える 4

1

私は戻ってきて答えを受け入れる必要があると考えました。

一番上のコメントは基本的に「やらないでください」と言っています。結局やらなかった。

于 2014-01-04T12:49:58.907 に答える
1

これは完全に最適なソリューションではありませんが、コードを変更せずに目的のバージョンのヘッダーを確実に取得したい場合は、-nostdinc-nostdinc++-I/usr/includeフラグと組み合わせて使用​​してみてください。私がドキュメンテーションを正しく理解していれば、gcc がシステム ヘッダー ファイルの標準リストを参照するのを防ぎ、代わりに-Iフラグで提供されたリストに従う必要があります。これは、ヘッダー検索リストに下位互換性ディレクトリを自動的に含めるという Os X の決定をオーバーライドする必要があります。

ただし、これらのオプションを使用するとコンパイルできなくなる可能性があります。-IGCC には、デフォルトのシステム ヘッダー検索リストに既に存在するフラグをディレクトリに指定する場合の規定があります(余分な-Iフラグは無視されます)。-nostdincシステム検索リストが (フラグによって) クリアされ、プロパティを add できるようになったことに気付くことができれば幸い-I/usr/includeです。

于 2011-11-25T21:54:26.610 に答える
0

C++ コードで使用される C ライブラリの関数に_Complexパラメーターや戻り値の型がない場合、C ヘッダー ファイルを変更するには、#include <complex.h>ディレクティブを囲むだけでなく、ヘッダー内の を使用する他のすべてのもの_Complex#ifndef __cplusplus/#endifディレクティブで囲みます。 C++ コードはそれを認識せず、混乱することはありません。一方、C ヘッダーを絶対に変更できない場合は、C++ コードで使用される関数プロトタイプとその他すべてを、C++ コードに含まれる新しいヘッダーにコピーできます。

編集

#include "/usr/include/complex.h"ヘッダーのあいまいさを解消したいだけなら、単純に の代わりに試すことができますが、#include <complex.h>このように標準ライブラリ ヘッダーへの絶対パスを使用することはお勧めできず、おそらく移植性がありません。

于 2011-11-25T21:37:40.107 に答える
0

コード内のヘッダーを extern ブロックでラップします。つまり、

  extern "C"{
  // include your c header here
  }

それがうまくいくと思います。上記のコードのフォーマットについて申し訳ありませんが、その機能は明らかに iPhone では動作しません。

于 2011-11-25T21:41:35.300 に答える