web-dev-qa-db-ja.com

C ++コードをCに変換する方法

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

私には次の質問があります:

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

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

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

46
goldenmean

実際、このようなツール、ComeauのC++コンパイラがあります。 。手動で保守できないCコードが生成されますが、問題はありません。 C++コードを維持し、その場でCに変換します。

32
MSalters

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

PS:まったく使っていない。動作するかどうか教えてください。

16
plan9assembler

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

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

全体的には、重要な質問への回答に大きく依存します。C++コードを使用している場合、代わりにCが必要なのはなぜですか。

6
Richard

たぶん良いol ' cfront はどうでしょうか?

5
niutech

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

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

おそらく想像できるように、CはCPUのアセンブラーとまったく同じように柔軟であるため、C++からCへのコンパイラーは技術的なPovから実装するのに本当に問題ありません。

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

あなたはこれらの人をチェックアウトしたいかもしれません: http://www.edg.com/index.php?location=c_frontend (上記のリンクは何のための参考にすぎませんを行うことができ、フロントエンドのライセンスを数万ドルで取得します)

PS私の知る限り、GNUによるC++からCへのコンパイラはありません。これは完全に私を打ち負かします(私がこれについて正しいなら)。 C言語はかなり小さく、その内部メカニズムはかなり初歩的であるため、Cコンパイラーは1人年の作業のようなものを必要とします(このようなコンパイラーを自分で数年前に書いたので、仮想]スタックマシンの中間コード)、およびCコンパイラを1回記述するだけでよいのに、維持された最新のC++コンパイラを持つことができるのは素晴らしいことです...

4
Gyll

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

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

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

Cへのコンパイルを実行する製品は次のとおりです。

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

  • 一般的な神話とは異なり、この記事の執筆時点では、C++をCに変換するg ++のバージョンはありません。このようなことは実行可能に思えますが、実際に(まだ)実行したことは誰にもわかりません。

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

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

2
Shafik Yaghmour