51

C++ コードがいくつかあります。コードには、多くのクラスが定義されており、それらのメンバー関数、コンストラクタ、それらのクラスのデストラクタ、いくつかのテンプレート クラス、および多数の C++ 要素が定義されています。次に、ソースをプレーンな C コードに変換する必要があります。

次の質問があります。

  1. C++ コードとヘッダー ファイルを C コードに変換するツールはありますか?

  2. コードを完全に書き直す必要がありますか (コンストラクター、デストラクタを削除し、そのコードをいくつかinit()deinit()関数に移動する必要があります。クラスを構造体に変更し、既存のメンバー関数をそれらの新しく定義された構造体の関数ポインターとして作成し、それらを呼び出します。関数ポインタなどを使用する関数..)?

  3. 自分で手動で変換する必要がある場合、C++ から C への変換を行う際に注意する必要がある C++ 固有のコード データ構造/セマンティクスは何ですか?

4

6 に答える 6

31

確かにそのようなツールがあります。コモーの C++ コンパイラです。. 手動で保守できない C コードが生成されますが、問題ありません。C++ コードを維持し、その場で C に変換するだけです。

于 2009-04-10T10:37:45.263 に答える
23

http://llvm.org/docs/FAQ.html#translatecxx

いくつかのコードを処理しますが、一部の最新の C++ 規則に対して完全に更新されていないため、より複雑な実装では失敗します。したがって、何が許可されているかを感じるまで、頻繁にコードをコンパイルしてみてください。

バージョン 9.0.1 の場合、コマンド ラインからの使用構文は次のとおりです。

clang -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
clang -march=c  CPPtoC.bc -o CPPtoC.c

古いバージョン (移行バージョンがわからない) の場合は、次の構文を使用します。

llvm-g++ -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
llc -march=c  CPPtoC.bc -o CPPtoC.c

これは、真の ANSI C ではなく、C の GNU フレーバーを作成することに注意してください。コードに多額の投資をする前に、これが役立つかどうかをテストする必要があります。たとえば、一部の組み込みシステムは ANSI C のみを受け入れます。

また、機能するがかなり判読できないコードが生成されることにも注意してください。最終的な C コードについては気にせずに、C++ コードにコメントを付けて維持することをお勧めします。

EDIT : この機能の公式サポートは削除されましたが、ユーザーはJulia 言語開発者からのこの非公式サポートを引き続き使用して、上記の機能を実現できます。

于 2009-04-10T10:48:32.727 に答える
5

たぶん古き良きcfrontでいいのでしょうか?

于 2012-10-03T23:05:29.643 に答える
5

C で OO を実行することはできますが (たとえば、theType *thisメソッドに最初のパラメーターを追加し、ポリモーフィズムのために vtables のようなものを手動で処理することによって)、これは設計として特に満足できるものではなく、見栄えも悪くなります (プリプロセッサのハックがあっても)。

これがどのように機能するかを比較するために、少なくとも再設計を検討することをお勧めします。

全体として、重要な質問への回答に大きく依存します: 動作する C++ コードがある場合、代わりに C を使用する理由は何ですか?

于 2009-04-10T10:38:13.827 に答える
4

コンパイラは、「フロントエンド」と「バックエンド」という 2 つの主要なブロックで構成されています。コンパイラのフロントエンドはソースコードを分析し、ソースコードよりもマシンアルゴリズムによる分析がはるかに簡単な、ソースコードの何らかの形式の「中間表現」を構築します(つまり、C++などのソースコードは人間のプログラマーがコードを書くのに役立つように、中間フォームは、その中間フォームを簡単に分析するアルゴリズムを単純化するのに役立つように設計されています)。コンパイラのバックエンドは、中間形式を取り、それを「ターゲット言語」に変換します。

現在、汎用コンパイラのターゲット言語は、さまざまなプロセッサのアセンブラ言語ですが、コンパイラのバックエンドが他の言語でコードを生成することを禁止するものは何もありません。汎用CPUアセンブラ。

おそらく想像できると思いますが、C は間違いなく CPU のアセンブラーと同じくらい柔軟であり、C++ から C へのコンパイラーは、技術的な観点から実装するのに問題はありません。

C++ ---frontEnd---> someIntermediaryForm ---backEnd---> C

これらの人たちをチェックしたいかもしれません: http://www.edg.com/index.php?location=c_frontend (上記のリンクは何ができるかについての情報です。彼らは数万ドルでフロントエンドのライセンスを取得しています。 )

PS 私の知る限り、GNU による C++ から C へのコンパイラはありません。C 言語はかなり小さく、その内部メカニズムはかなり初歩的であるため、C コンパイラーには 1 人年程度の作業が必要です (私がそのようなコンパイラーを何年も前に自分で書いたのは、この直接の理由であると言えます。[仮想] スタック マシンの中間コード)、および維持された最新の C++ コンパイラを使用できる一方で、C コンパイラを 1 回作成するだけで済みます。

于 2013-01-10T16:35:36.233 に答える
2

これは古いスレッドですが、これC++ Faqに関するセクション (アーカイブされた 2013 バージョン)があるようです。これは、作者に連絡があれば更新されるようですので、長期的にはより最新のものになるでしょうが、現在のバージョンは次のとおりです。

あなたが何を意味するかによります。つまり、C++ を読み取り可能で保守可能な C コードに変換することは可能ですか? 申し訳ありませんが、答えはノーです。C++ の機能は C に直接マッピングされません。さらに、生成された C コードは、人間が従うことを意図していません。代わりに、C++ コンパイラをまだ持っていないプラットフォームにコンパイルする目的で C++ を C に変換するコンパイラはありますか? 運が良ければ、読み続けてください。

C++ を C にコンパイルするコンパイラは、プログラムの完全な構文およびセマンティック チェックを行い、たまたまオブジェクト コードを生成する方法として C コードを使用します。このようなコンパイラは、単なる派手なマクロ プロセッサではありません。(そして、これらがプリプロセッサであると主張する電子メールを私に送信しないでください - それらは完全なコンパイラではありません。) ISO 標準 C++ のすべての機能を C に変換することによって実装することが可能であり、例外処理を除いて、通常は結果として得られます。オブジェクト コードで、従来の C++ コンパイラによって生成されたコードと同等の効率を実現します。

以下に、C へのコンパイルを実行する製品をいくつか示します。

  • Comeau Computingは、 C コードを出力するEdison Design Group のフロント エンドに基づくコンパイラを提供しています。
  • LLVMは、C コードを生成するダウンロード可能なコンパイラです。ここここも参照してください。LLVM による C++ から C への変換の例を次に示します。
  • AT&T の Bjarne Stroustrup などによって行われた C++ の元の実装であるCfrontは、C コードを生成します。ただし、2 つの問題があります。90 年代半ばから所有権の変更の迷路が始まり、ライセンスを取得するのが困難であり、同時に開発が中止されたため、バグ修正が行われず、サポートもされていません。新しい言語機能 (例: 例外、名前空間、RTTI、メンバー テンプレート)。

  • 一般的な神話に反して、これを書いている時点では、C++ を C に変換する g++ のバージョンはありません。そのようなことは実行可能のようですが、実際に (まだ) 実行した人がいるとは知りません。

通常、ターゲット プラットフォームの CPU、OS、および C コンパイラを指定して、生成された C コードが特定のプラットフォームを対象とするようにする必要があることに注意してください。これは次のことを意味します。(a) プラットフォーム X 用に生成された C コードをプラットフォーム Y でコンパイルすることはおそらくできません。(b) 翻訳を自分で行うのは困難です。これらのツールのいずれかを使用すると、おそらくはるかに安価で安全になります。

もう一度言いますが、これらが単なるプリプロセッサであると私にメールしないでください - そうではありません - それらはコンパイラです。

于 2013-03-12T18:37:54.180 に答える