2010-06-17 86 views
5

我希望能夠向我的實際代碼添加(非常重複的)C/C++代碼,但是在編譯時,代碼可能來自說,python的stdout腳本,就像用宏一樣。使用腳本在編譯時生成代碼

例如,假設我想有依賴於給定類的公共屬性的功能,能像下面在我的C++代碼將是一個祝福:

generate_boring_functions(FooBarClass,"FooBarClass.cpp") 

是這樣使用傳統手段可行嗎?或者我必須使用Makefiles和臨時源文件進行破解?

謝謝。

+0

我以爲Makefiles是常規手段。你有什麼想法? – 2010-06-17 17:26:13

+1

什麼是枯燥的功能?他們是否可以通過基於模板的解決方案來解決問題? – 2010-06-17 17:28:15

+0

不,它不是模板可解的,我知道Makefiles是常規手段,但我只是想通過做簡單的愚蠢簡單的「g ++ foo.cpp -o foo」來工作,我想這太難以問了;) – Manux 2010-06-17 17:39:47

回答

3

你很可能需要稍微調整一下Makefile。編寫一個(Python)腳本可以讀取每個源文件作爲額外的預處理步驟,用正確的代碼替換generate_boring_functions(或任何其他腳本宏)的實例很容易,可能只需用正確的參數調用generate_boring_functions.py ,並通過標準輸入將源發送給編譯器來繞過臨時文件的需要。

該死的,現在我想做出這樣的事情。

編輯:像這樣的規則,卡在一個makefile中,可以用來處理額外的構建步驟。這是未經測試的,並且僅在完整性時才添加。

%.o : %.cpp 
    python macros.py $< | g++ -x cpp -c - -o [email protected] 
+0

我如何將源發送到編譯器通過標準輸入(不使用臨時文件)? – Manux 2010-06-17 17:38:03

+0

Oy,http://stackoverflow.com/questions/2083874/compile-string-of-c-code – Manux 2010-06-17 17:56:21

+0

@Manux:這種方法一次只能使用一個源文件... – 2010-06-17 17:58:57

2

makefile(或等價物)是「常規」的意思!

0

您可以嘗試Boost預處理器庫。它只是常規預處理器的擴展,但如果你有創意,你幾乎可以獲得任何東西。

3

如果一個makefile文件是不是你足夠的常規,你可以用巧妙的編寫宏度日。

class FooBarClass 
{ 
    DEFINE_BORING_METHODS(FooBarClass) 

    /* interesting functions begin here */ 
} 

我經常看到這樣做來實現COM類的樣板部分。

但是,如果你想要的東西既不是make也不是宏,那麼我不知道你可能意味着什麼。

+0

+1宏來簡化樣板代碼。 – 2010-06-17 18:33:41

0

你看過PythoidC嗎?它可以用來生成C代碼。

2

我從來沒有使用過這種特殊的技術,但它聽起來好像你正在尋找像Ned Batchelder's Cog這樣的工具。

將Python腳本嵌入到C++源文件中,以便在通過齒輪工具運行時爲C++編譯器生成額外的C++代碼以供使用。所以你的構建過程將包含一個額外的步驟,以便在調用C++編譯器之前使cog生成實際的C++源文件。