Существует ли #define, связанное с SubSystem

Я создаю main с помощью макроса и должен иметь возможность проверять выбранную SubSystem во время компиляции /SUBSYSTEM: WINDOWS или /SUBSYSTEM: CONSOLE, чтобы создать соответствующую основную функцию. Есть ли способ #define, который я могу проверить, выполнив это?

Ответы

Ответ 1

Если вы пытаетесь упростить задачу пользователям вашей библиотеки (или что-то еще), вы можете просто создать как WinMain, так и main из своего макроса. По умолчанию компоновщик устанавливает консольные приложения на main, а win32 - на WinMain. Другая "основная" функция будет проигнорирована.

(Предположительно, остальная часть кода не использует ни один из аргументов основной функции (argc, argv, hInstance и т.д.), если он работает с обоими.)

Можно использовать параметр _CONSOLE, но он не появляется автоматически; вам нужно добавить его вручную в свойства проекта. С другой стороны, выбор символа запуска является автоматическим. Таким образом, просто предоставление обеих функций и возможность выбора компоновщика могут сделать жизнь проще, потому что разработчику проекта не нужно ничего устанавливать и действительно может переключиться с Windows на консольное приложение (возможно, даже на конфигурацию), не делая этого что-нибудь.

Ответ 2

_CONSOLE должен сделать трюк для вас.
Также вы можете выбрать подсистему с помощью #pragma comment( linker, "/subsystem:windows" ) или #pragma comment( linker, "/subsystem:console" ), если вы действительно хотите пройти этот маршрут.

Ответ 3

Это не так, как это действительно работает. Вам нужно написать совершенно другой код в консольном приложении и в родном приложении Windows. В консольном приложении вы используете printf или cout для создания вывода, не так много, если оно используется для мыши. Для родного приложения Windows требуется цикл сообщений и создание окна с процедурой окна, которая обнаруживает сообщение WM_PAINT для обновления окна. Etcetera.

Но вы можете написать код, который делает оба. Просто напишите как функцию main(), так и функцию WinMain(), CRT автоматически выберет правильный.