2011-10-20 33 views
-2

對不起,我的英語薄弱如何在Borland的禁用異常處理代碼C++編譯器5.5

我使用Borland C++編譯器5.5和我喜歡它,但 一個問題讓我擔心有時;我編寫純c 應用程序與沒有這樣的一個C++的'功能',但我 編譯與-P開關強制'C++編譯',因爲 如果我在C模式編譯我必須聲明「INT我」 之前for循環,這是愚蠢的。所以我編譯在c + + 模式,但我很擔心,它使編譯器 將一些異常處理代碼 進入我的應用程序 - 當我看着我的prog 與十六進制編輯器我看到很多奇怪的字符串 可能與.exe中的異常處理; 當我使用-x-切換到我的應用程序時,它帶來 沒有任何效果。我甚至可以給一個鏈接到我的exe文件progs的

dl.dropbox.com/u/42887985/unpack%20aeroplane.zip

我怎樣才能確保沒有異常處理 (且無任何其他不必要的東西在EXE becouse 我喜歡保持它微小)是否存在內?

韋裏的答案,那麼多TNX,重要的是 對我來說,冷杉

+0

,但如果我在C模式編譯我必須INT我寫befor for循環,這是不很多人可以接受的做它一千次(「int i = 0; for(i = 0; i

+0

fir例如有說明「C0D32.OBJ 32位DLL啓動模塊(cod32w:寬字符版本; cod32x:無異常處理)」 - 可能是這樣一個是原因,也許我可以將C0W.OBJ更改爲一些C0W32x.obj,但我不確定 –

回答

3

你不能有C++沒有例外的支持,這是標準的一部分。無論它對你的可執行文件有多大的影響,我都不能說。

如果我是你,我會得到一個更現代的C編譯器。在Windows上,你應該嘗試mingw。使用C99,您可以在任何地方聲明變量。 Borland編譯器是古老的。

+0

不可接受的答案。 BCC5.5是我的選擇,它對我來說非常好(輕快,沒有任何與winapi ogl應用程序有關的問題) - 我只需要我的問題不是準「建議」的答案 –

0

正如人們注意到的那樣,您不能從C++庫中排除異常處理。但也有一些其他的編譯器選項和其他技巧,這可以幫助你減少代碼大小

  1. 運行時類型識別或RTTI,它被用來在C++之類的東西typeiddynamic_cast可安全地打開的這個選項如果你不使用任何C++的可能性,(在循環內部定義變量doensn't無關緊要:-)),這可能會稍微減少可執行文件的大小。 RTTI選項是默認啓用的,你可以切換使用-RT-切換
  2. 代碼優化它 - 如果你使用聚合-02開關,然後所有的優化被啓用,程序會被編譯成是最快的可能,但不是最小。您應該使用單獨的開關進行不同的優化。使用-Ov(感應變量)和-Og(優化常用子表達式)優化開關,這可以減少代碼大小。不要使用會增加代碼大小的-Oi開關(串聯內部函數)
  3. BCC 5.5使用80386指令集(-3開關)編譯默認值。您可以選擇可以減少代碼大小的Pentium Pro指令集(-6開關)。 MMX指令集也用於這個選項 - 它增加了速度,並且減小了尺寸(抱歉在石器時代編譯器中沒有SSE指令;-))
  4. 使用Pascal函數調用約定。這種功能會比使用C調用約定的功能快一些,小一些。一個缺點 - 你不能在這個約定中使用c-style變量參數列表。您可以通過使用函數定義__pascal關鍵字或通過提供-p開關允許在源文件中本公約編譯
+0

OKAY,tnx,但有一個切換編譯器選項:-x-據說禁用應用程序中異常處理代碼的生成。我嘗試使用它,但它不會改變任何東西。我讀過的地方可能是因爲鏈接使用異常處理的庫(可能在以下提到的那些庫中:「默認情況下,BCC32使用文件C0W32.OBJ,CW32.LIB和IMPORT32.LIB啓動ILINK32(初始化模塊,時間庫和Windows導入庫)。「) –

+0

所以問題是1)我可以將這些庫更改爲一些沒有異常處理2)我可以使用c-mode編譯比默認更現代的方式,所以我可以使用int i inside for() –

+0

我不知道你的編譯器是否附帶了RTL源代碼。如果你有源代碼,你可以嘗試重新編譯RTL(在你的情況下它是CW32.LIB - RTL靜態庫),沒有異常支持,但我不建議這樣做。要小心,改變RTL本身的任何東西都是非常棘手和不平凡的。我有C++ Builder 5的RTL源代碼,它也使用bcc32 ver 5.5,Borland說如果你重新編譯RTL,即使使用Borland本身提供的默認makefile,它也不承擔任何責任=) –