2013-03-31 10 views
6

C++のソースコードをC/C++のソースコードに変換するツールはありますが、インスタンス化された(展開されていない)テンプレートはありますか? これは、明白な理解のために、どのコードのC++テンプレートを変換するために必要です。 IDE(MSVS、QtCreator、...)またはコンパイラ(ICC、GCC、MSVC、Clang)に存在する可能性がありますか?C++のソースコードをC/C++のソースコードに変換するツールはありますが、インスタンス化された(展開されていない)テンプレートはありますか?

+0

維持されていない私は1つを覚えている:クランを使用することができます私がひどくテンプレートのC++コードをコンパイルしてしまった時クラス、テンプレート、ファイルの数が私が必要としているものを見つけ出すために不当に高い水準に達していたからです。もちろん、これはすべての場合に機能しません。 –

+0

@Alexey Frunzeだから、私はアセンブリコードしか見ることができませんが、C/C++ではなく、テンプレートのインスタンス化後のコードは本当ですか? – Alex

+0

はい、いいえ。コードが抽象レイヤのすべての背後にあることを知りたいのであれば、あなたはそうするでしょう。関数が呼び出され、使用される型が分かります。したがって、ソースコードにある情報の一部が失われても、かなり多くの情報が表示されます。ただし、コードの最適化を有効または無効にすることに興味があるかもしれません。あまりにも重い最適化を行うと、多くの関数がインライン展開され、コード構造が明らかにならないことがあります。 –

答えて

4

これは出回っへのアレクセイ・フルンゼからSO

アイデア/原則に答えたようです逆アセンブルされたコードを使用すると、一緒にかなり良いです単純化されたテンプレートを使用すると、それが何をするのかを正確に理解する良い機会があります。

編集1 コンパイラは

  1. 使用行っていた事柄の理解を得るためにどのようにいくつかの他の可能性があります。アセンブリを取得し、ツールc++filt(その一部を使用するgcc -S -O1 {yourcode.cpp}は、 binutilsのあなたはC-コード
  2. 使用して、より快適に感じる場合はC-コードに解体を変換する:g++ -fdump-tree-original file.cpp wはMSVC++デバッガを使用して、いくつかの(擬似)C++コード
  3. を取得します最後instatiation後にブレークポイントi番目とinstatiatedテンプレート
  4. 利用のパラメータであり、すべてのタイプと値を参照してください。コンパイラはinstatiatedとテンプレートにあなたを最適化する方法を知っているためにインスタンス化テンプレートを使用してXMLを生成するためのGCC XMLFAQ
  5. をLLVM IRを取得し、
  6. コモC++はCのコードにC++を「コンパイル」することができますテキストに変換するllvm-disを使用する-emit-llvmが、今コンパイラはもう
1

インスタンス化またはそのパラメータの中に意図的なエラーを置いて問題を回避すると、コンパイラ(適切なバージョン:gcc 4.8、clangなど)を次の行に沿って出力できます。テンプレートXXXはA = int、B = float、..でインスタンス化されています。 "

関連する問題