入力としてCソースファイルを取り込み、すべての関数をインライン化し、別のCソースファイルを出力するツールはありますか?すべての関数をインライン化してCコードを取得
すべての機能は1つのファイルに含まれており、再帰/有効性はありません。関数は必ずしもinline
属性を持つとは限りません。
このツールで標準ライブラリ(たとえばprintf
,malloc
、sqrt
など)で宣言されている関数を無視すると問題はありません。
関連する質問:link:唯一の回答は間違っています。
入力としてCソースファイルを取り込み、すべての関数をインライン化し、別のCソースファイルを出力するツールはありますか?すべての関数をインライン化してCコードを取得
すべての機能は1つのファイルに含まれており、再帰/有効性はありません。関数は必ずしもinline
属性を持つとは限りません。
このツールで標準ライブラリ(たとえばprintf
,malloc
、sqrt
など)で宣言されている関数を無視すると問題はありません。
関連する質問:link:唯一の回答は間違っています。
それはあなたを助けません。少なくともgccでは、テキストソースコードが内部表現に変換された後にインライン展開が行われます。
あなたはこれを見てとることができ:
int x;
__attribute__((always_inline)) inline void foobar() { x--; }
int main() {
x = 1;
foobar();
return x;
}
になります。この上g++ example.cpp -O0 -g -E
を呼び出す:
✓ pan:~$ g++ example.cpp -O0 -g -E
# 1 "example.cpp"
# 1 "/home/meyer//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "example.cpp"
int x;
__attribute__((always_inline)) inline void foobar() { x--; }
int main() {
x = 1;
foobar();
return x;
}
しかしg++ example.cpp -O0 -g -o example.elf
でコンパイルするとき、生成される実行可能ファイルはもう機能foobar
を持っていません。 。 objdump -w | less
で確認し、属性を省略する場合と比較することができます。
-O0
を使用して、ほとんどのコンパイラーが、機能が自明にint main() { return 0; }
に最適化されていることが分かります。
あなたがそこでやろうとするもののツールがあるかどうかわかりません。しかし、私はC + +を意識したレクサー/パーサーの組み合わせが必要なのではないかと危惧しています。
唯一の答えは間違っています。そのGCC特有の属性は宣伝されている通りです。 – StoryTeller
それは間違いではない、それはちょうどこの質問が何をしていない(全く異なる質問なので)。 –
IMO不可能でも無意味でもあります。引数の引き渡しが不要で、変数が呼び出し元と呼び出し先の間で共有されるため、インライン展開が機能します。このプロセスは、コンパイラおよびアーキテクチャに依存する(レジスタ)割り当てに依存する。例:32個のレジスタを持つマシンでインライン展開し、少ない数のマシンで前処理されたコードをコンパイルするとどうなるか想像してみてください。 – wildplasser