2017-03-08 22 views
-1

是否有一個工具將C源文件作爲輸入,內聯所有函數並輸出另一個C源文件?內嵌所有函數並獲取C代碼

所有功能都包含在一個文件中,並且沒有遞歸/ gotos。函數不一定具有inline屬性。

如果此工具忽略標準庫中聲明的函數(如printfmallocsqrt),則確定(實際上是可取的)。

相關問題:link:唯一的答案是不正確的。

+1

唯一的答案是不正確的!?該GCC特定屬性的功能與廣告一樣。 – StoryTeller

+2

這沒有錯,它只是沒有做這個問題的要求(因爲他們是完全不同的問題)。 –

+1

IMO它或者是不可能的或者無意義的:內聯工作是因爲沒有需要的參數傳遞,並且因爲變量在調用者和被調用者之間共享。這個過程依賴於(寄存器)分配,這是編譯器和架構相關的。例如:想象一下,如果你在32個寄存器的機器上內聯了*,並且在一臺機器上編譯了預處理的代碼,那麼會發生什麼?寄存器廢棄將是結果。 – wildplasser

回答

1

這不會幫助你。至少對於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++ - 交叉編譯器,以在所有情況下正確執行此操作。

相關問題