2009-04-10 14 views
42

私はいくつかのC++コードを持っています。コードには、多くのクラスが定義されています。そのメンバ関数、コンストラクタ、それらのクラスのデストラクタ、テンプレートクラスがほとんどなく、C++のものがたくさんあります。今私はソースをプレーンなCコードに変換する必要があります。 C++コードをCに変換するには

I

持って、次の質問:

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

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

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

答えて

29

確かにComeauのC++コンパイラのようなツールがあります。 。手動では維持できないCコードが生成されますが、問題はありません。あなたはC++コードを維持し、ただちにC言語に変換します。

+0

@MSalters:Comeausコンパイラについてのポインタをありがとう。しかし、悲しいことに、私の目的を果たしていないのは、コンパウスの中間形式のCコードを入手することができず、たとえそれが通常のANSI-Cコンパイラでコンパイルできないとしても得られます。 – goldenmean

+2

コードで例外やテンプレートを使用していない場合は、コードで動作するcfrontの古いコピーを入手する機会があります。しかし、MSaltersが言っているように、それは醜いだろうと言っています:-) – lothar

+0

標準ライブラリ機能を使用しないでください。 –

6

CでOOを行うことができます(たとえば、theType *thisのメソッドに最初のパラメータを追加し、多態性のvtablesのようなものを手動で処理することによって)これは決して特に満足できるものではなく、プロセッサのハック)。

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

全体的には、重要な質問に対する答えに大きく依存します.C++コードを使用している場合は、なぜC言語を使用するのですか?

+5

著者の理由は明らかに状況によって異なりますが、理由は存在します。 C++コンパイラが特定のプラットフォーム上に存在しない場合や、何らかの理由で利用できない場合があります。それは非常に優れた学習ツールとしても役立ちます。 – TechZilla

17

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

PS:私は全くそれを使用していません。それが動作するかどうか私に知らせてください。

+0

@ plan9assembler:ポインタありがとう。私はそれをチェックし、あなたに知らせます。 – goldenmean

+1

私はLLVMを使ってhello_world.cppをCファイルに変換しようとしました。結果のCコードはマシンコードと同じくらい醜いです。プリプロセッサのインクルードはすべて消えています。 – MikimotoH

+1

@MikimotoH、それは構文のソース翻訳の構文ではないので、そのように見えます。そのコンパイラは本当にcに出力できるコンパイラです。つまり、まだリンクされているC++ライブラリに依存しています。デバッグや資料の閲覧に本当に最適です。 ところで:醜いかもしれませんが、私はマシンコードよりも優れていると信じており、少なくともそれから学ぶことができます。どのような分解よりもclang C++からcへの方が良いことが分かります。 – TechZilla

5

多分良いオール 'cfrontはできますか?

+3

私が知る限り、cfrontは長い間維持されておらず、最新のC++コードを扱うことはまずありません。 –

4

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

一般的なコンパイラのターゲット言語は、さまざまなプロセッサ用のアセンブラ言語ですが、コンパイラのバックエンドが他の言語のコードを生成することを禁止するものではありません。一般的なCPUアセンブラほどフレキシブルです。

CはC++コンパイラが技術的なpovから実装するのに本当に問題がないように、Cは確かにCPUのアセンブラほどフレキシブルです。

だから、あなたが持っている:C++ ---フロントエンドを---> someIntermediaryForm ---バックエンド---> C

あなたはこれらの人をチェックアウトすることができます:http://www.edg.com/index.php?location=c_frontend (上記のリンクは、のためだけに有益です何ができるか、彼らは彼らの前には数万ドルのために終了ライセンス)

(PS は、私の知る限りでは、GNUによってCコンパイラに、このようなC++何もありません、これは完全に私を打つ場合私はこれについて正しいです)。 C言語はかなり小さく、内部メカニズムはかなり初歩的なので、Cコンパイラには1年の仕事のようなものが必要です(私はあなたにこの最初の手を伝えることができます。何年も前にこのようなコンパイラを書いたことがあります。仮想マシンのスタックマシンの中間コード)を使用することができ、Cコンパイラを一度書くだけで、最新のC++コンパイラを保有することができれば、素晴らしいことになるでしょう。

+0

一般的なコンパイラのターゲット言語は、さまざまなプロセッサ用のアセンブラ言語(またはマシンコード??)です – qPCR4vir

2

これは古い明らかにC++ Faqにはsectionがあります。これは、著者が連絡を取った場合に更新されるように見えるので、これはおそらく長期的には最新のものになるでしょう。

関連する問題