是否有一個工具將C源文件作爲輸入,內聯所有函數並輸出另一個C源文件?內嵌所有函數並獲取C代碼
所有功能都包含在一個文件中,並且沒有遞歸/ gotos。函數不一定具有inline
屬性。
如果此工具忽略標準庫中聲明的函數(如printf
,malloc
和sqrt
),則確定(實際上是可取的)。
相關問題:link:唯一的答案是不正確的。
是否有一個工具將C源文件作爲輸入,內聯所有函數並輸出另一個C源文件?內嵌所有函數並獲取C代碼
所有功能都包含在一個文件中,並且沒有遞歸/ gotos。函數不一定具有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++ - 知道的詞法分析器/解析器 - 組合來完成C++ - to-C++ - 交叉編譯器,以在所有情況下正確執行此操作。
唯一的答案是不正確的!?該GCC特定屬性的功能與廣告一樣。 – StoryTeller
這沒有錯,它只是沒有做這個問題的要求(因爲他們是完全不同的問題)。 –
IMO它或者是不可能的或者無意義的:內聯工作是因爲沒有需要的參數傳遞,並且因爲變量在調用者和被調用者之間共享。這個過程依賴於(寄存器)分配,這是編譯器和架構相關的。例如:想象一下,如果你在32個寄存器的機器上內聯了*,並且在一臺機器上編譯了預處理的代碼,那麼會發生什麼?寄存器廢棄將是結果。 – wildplasser