c99 ソース コードを自動的に c89 に変換するにはどうすればよいですか? c99 ライブラリを Visual C++ でコンパイルしたいのですが、MSVC は c89 しかサポートしていません。多くの変更は、構造体初期化子などの構文のみであり、「de-c99」コードを自動的に作成するツールを作成できます。このプリプロセッサは存在しますか?
3 に答える
Clang ベースのソースからソースへのトランスレーター:
商用のComeau C/C++ コンパイラでこれを行うことができます。
または、適切な C コンパイラ (MinGW、Pelles C、Intel 経由の GCC または Clang など) を使用して、生成されたオブジェクト ファイルをリンクします。ただし、これらのすべて (特に MinGW) が Microsoft のデバッグ形式をサポートしているわけではありません。
必要なのはプログラム変換システムです。このようなツールは、ソース コードを読み取り、コンパイラ データ構造 (抽象構文ツリーなど) を構築し、それらの構造に (ソースからソースへの) 変換を適用してから、変更されたデータ構造からソースを再生成できます。
C99 を解析して C89 に変換できるものが必要です。DMS Software Reengineering Toolkitは、 C フロント エンド(MSVC 89 を含む C の両方の言語と ObjectiveC を処理できます) を使用して、これを行うことができます。これを行うには、成熟したパーサーが必要です。
多くの人は、必要なのは C99 パーサーだけだと提案するかもしれません。実際問題として、それは正しくありません。典型的なコンピューター言語で興味深い変換を行うには、シンボル テーブル データ、何らかのデータ フローなどが必要です。詳細については、Life After Parsingに関する私のエッセイと、DMS がその生命をどのように提供するかを参照してください。
そのような側面の 1 つは、構造体初期化子を置き換えるエンコード方法です。C99 AST をたどり、そのような構造体初期化子を見つけ、手続き的にツリーをハッキングするカスタム コードによって、これを行うことができます。はい、それは機能しますが、簡単ではなく、ツリーの構造について多くのことを知る必要があります。DMS はソースからソースへの書き換えを提供するため、変更するイディオムを認識するパターンと、結果のイディオムを生成するパターンを、すべて C サーフェス構文を使用して記述できます。