2011-01-29 45 views
13

我使用宏創建main,並且需要能夠在編譯時檢查選定的子系統/ SUBSYSTEM:WINDOWS或/ SUBSYSTEM:CONSOLE,以生成適當的主功能。有沒有一個#define我可以檢查完成這個?是否存在與子系統關聯的#define

+0

你不應該生成一個主函數,因爲生成它對你自己是毫無價值的,也是對他人的障礙。即它具有消極的效用。但是,如果你這樣做,就像生成一個`main`函數一樣,然後*生成一個標準的`main` *。無論構建的子系統如何,它都可以正常工作。注意:在這個部門有些挑戰的微軟工具中,除非你正在做一個MFC應用程序,否則設置鏈接器選項`/ entry:mainCRTStartup`,在這種情況下,你遇到了其他問題(即微軟)有接管`main`的相同的真正壞主意™。 – 2015-07-22 16:58:32

回答

4

如果您試圖讓您的庫的用戶(或其他任何用戶)變得容易,您可以從宏中生成WinMainmain。默認情況下,鏈接器將控制檯應用程序設置爲main,而win32應用程序從WinMain開始。另一個「主」功能將被忽略。

(大概是代碼的其餘部分不使用任何的主要功能參數(argcargvhInstance等),如果它是既合作。)

_CONSOLE限定可以使用,但它不會自動出現;您必須手動將其添加到項目屬性中。另一方面,啓動符號的選擇是自動的。因此,提供這兩種功能並讓鏈接器選擇可能會使生活更輕鬆,因爲項目創建者不必設置任何東西,並且確實可以從Windows切換到控制檯應用程序(可能甚至是每個配置),而無需執行任何東西。

11

_CONSOLE應該爲你做的伎倆。
如果你真的想走這條路線,你也可以選擇使用#pragma comment(linker, "/subsystem:windows")或​​的子系統。

+2

這絕對是更好的答案,因爲它直接回答了手動指定系統與讓鏈接器確定它(或更改項目設置)的原始問題。 – 2011-02-07 03:20:34

+0

「_CONSOLE」如何定義? – jww 2016-10-02 05:01:44

3

這並非如此。您必須在控制檯應用程序和本地Windows應用程序中編寫截然不同的代碼。在控制檯應用程序中,您可以使用printf或cout來生成輸出,如果有任何鼠標使用,則不需要太多。本機Windows應用程序需要消息循環並創建一個窗口過程,該過程檢測WM_PAINT消息以更新窗口。等等。

但是你可以編寫兩種代碼。只需寫入main()和WinMain()函數,CRT就會自動調用正確的函數。

相關問題