25

ユーザーがC++クラスを使用して構成するプログラムがあります。同じクラスを使用して、C99(Open CL言語)のサブセットのみを使用できるプログラムを構成する必要があります。

だから私の質問は:C ++をCコードにコンパイルする方法はありますか?

オープンソースは素晴らしいでしょう!

4

5 に答える 5

23

clang C ++フロントエンドを使用してllvmバイトコードを生成し、Cコードを出力するために使用できllcます。llcdoc、特にcオプションを参照してください。どちらもオープンソースであり、BSDのようなライセンスがあります。

于 2011-02-19T11:00:34.993 に答える
20

C ++ FAQには可能性のリストがあります:C ++をCに変換することは可能ですか?

要するに、これがあなたに特に読みやすいコードを与えることを期待することはできないということです。関係する複雑さを考えてください。多重継承、仮想関数の解決、テンプレート、演算子のオーバーロードなど。これらの概念を純粋なCで表現するための明確で簡潔な方法はありません。ただし、コンパイル可能なCだけが必要な場合は、これがおそらく次の方法です。行く。

于 2011-02-19T10:56:39.770 に答える
10

Comeauコンパイラはそれを実行できるようです。ウィキペディアから「実行可能ファイルを直接生成するのではなく、Comeau C / C ++はCコードを出力し、最終的なプログラムを生成するために別のCコンパイラを必要とします。」

しかし、私はそれを試したことがありません。

于 2011-02-19T11:01:50.750 に答える
4
  1. VisualGBDは、組み込みプラットフォーム用のコンパイルで開発できるVisualStudio拡張機能です。無料ではありませんが、試用版があります。それがあなたのアプリケーションで機能するかどうかは、私の心の中で価値があります。

    https://visualgdb.com

  2. LLVMは良いオプションです。

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

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

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

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

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

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

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

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

  3. コモーサイトは残念ながら死んでいます。Coherentはコモーに基づいて構築されており、いくつかのオプションを提供する場合があります。彼らは2018年まで維持されているVMを事前に構築しています。

    https://www.autometer.de/unix4fun/coherent/#inst_coh

  4. CLangは利用可能ですが、長い間更新されていません

    http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_3.0.3/source/cfront_3_0_3.tgz

于 2020-03-09T18:02:51.210 に答える
2
  1. Comeau Computingは、Cコードを出力するEdisonDesignGroupのフロントエンドに基づくコンパイラを提供します。
  2. LLVMは、Cコードを出力するダウンロード可能なコンパイラです。こことここも参照してください。LLVMを介したC++からCへの変換の例を次に示します。
  3. AT&TのBjarneStroustrupらによって行われたC++の元の実装であるCfrontは、Cコードを生成します。ただし、2つの問題があります。所有権の変更の迷路を経始めた90年代半ば以降、ライセンスを取得することが困難であり、同時に開発が停止したため、バグ修正が行われず、サポートされていません。新しい言語機能(例外、名前空間、RTTI、メンバーテンプレートなど)。
  4. 一般的な神話に反して、この記事の執筆時点では、C++をCに変換するバージョンのg++はありません。そのようなことは実行可能のようですが、実際に誰かが実行したことはわかりません(まだ)。

http://www.cs.technion.ac.il/users/yechiel/c++-faq/convert-to-c.html

于 2017-10-09T14:34:07.537 に答える