2013-02-05 65 views
1

我希望在應用程序中「提供」幾個函數/過程甚至是變量,而不用在我自己的代碼中使用它們。編譯器會自動忽略未使用的變量和函數,還是鏈接器?我該如何改變它?我已經試圖取消選中CodeGeneration ---> Optimization,但沒有運氣。在Delphi中編譯/鏈接未使用的函數/過程

+2

不確定「提供」是什麼意思,但是在編譯的應用程序中不包括未使用的代碼和變量是每個編譯器都做(或應該)做的基本優化。 –

+0

如何在不調用函數或讀取/寫入變量等的情況下實際執行該操作。 –

+2

如果沒有引用,鏈接器將刪除代碼,但是如果它不是如何引用該代碼? –

回答

5

如果程序中的某些內容引用該對象,則鏈接器無法將其刪除。所以,你可以趁這個是這樣的:

procedure StopLinkerRemoval(P: Pointer); 
begin 
end; 

然後在你的初始化部分,你可以這樣寫:

StopLinkerRemoval(@MyVar); 
StopLinkerRemoval(@MyFunction); 

所有你需要做的是指代的對象。你不需要調用這個函數,或者讀取/寫入這個變量,只需要它的地址即可。

+0

這將是最簡單的。非常感謝你。我會把StopLinkerRemoval過程放到我的庫中,並在需要時給它打電話:) –

+2

@Ben只是爲了好奇,但是什麼時候會這樣呢? – NGLN

+0

我需要它,所以其他應用程序可以在我的進程上調用CreateRemoteThread。 –

1

鏈接器是忽略未使用變量的鏈接器。但是,我不確定它是否和程序和功能一樣。你不能改變這個改變。

+0

+1謝謝你的回答。現在我知道這是鏈接器設置,我可能需要更改。 –

+1

不客氣! :) –

4

有「未使用」或不引用procedures/functionsprivateprotectedmethods在你的應用程序,你應該建立一個包,並把dcu文件導入到庫路徑編譯。

publicpublishedmethods即使沒有在您的應用程序中被引用編譯。

+0

+1這是一個非常棒的發現!很多代碼非常方便! –

+0

但它比這更復雜。在實現部分中定義的對象只能被剝離。私人成員可能會被剝奪。只有在包裹之外可以使用的東西才需要保持活力。 –

相關問題