2011-01-29 11 views
13

Estoy creando main con una macro y necesito poder verificar el Subsistema seleccionado en tiempo de compilación,/SUBSYSTEM: WINDOWS o/SUBSYSTEM: CONSOLE, para generar el apropiado función principal. ¿Hay algún #define que pueda verificar que logre esto?¿Hay un #define asociado con el SubSystem

+0

No debe generar una función principal, ya que generarla no tiene ningún valor para usted y es un obstáculo para los demás. Es decir. tiene una utilidad negativa para hacerlo. Pero si lo haces, como si estuvieras empeñado en generar una función 'main', entonces * genera un' main' estándar. Funciona bien, sin importar el subsistema de la compilación. Nota: con las herramientas de Microsoft, que son un poco desafiadas en este departamento, configure la opción del enlazador '/ entry: mainCRTStartup' a menos que esté haciendo una aplicación MFC, en cuyo caso se enfrenta al problema de que otros (es decir, Microsoft) tengan tenía la misma Really Bad Idea ™ de hacerse cargo de 'main'. –

Respuesta

4

Si está tratando de hacer las cosas más fáciles para los usuarios de su biblioteca (o lo que sea), puede generar WinMain y main desde su macro. El enlazador establece por defecto las aplicaciones de la consola para que comiencen en main, y las aplicaciones win32 comienzan en WinMain. La otra función "principal" será ignorada.

(Es de suponer que el resto del código no utiliza ninguno de los principales argumentos de la función (argc, argv, hInstance, etc.), si se trata de trabajar con ambos.)

El _CONSOLE definen podrían utilizarse , pero no aparece automáticamente; debe agregarlo manualmente en las propiedades del proyecto. La selección del símbolo de inicio, por otro lado, es automática. Así que solo proporcionar ambas funciones, y dejar que el enlazador elija, puede hacer la vida más fácil, porque el creador del proyecto no tiene que configurar nada, y puede cambiar de Windows a la aplicación de la consola (posiblemente incluso por configuración) sin tener que hacer cualquier cosa.

11

_CONSOLE debe hacer el truco para usted.
También puede seleccionar el subsistema usando #pragma comment(linker, "/subsystem:windows") o #pragma comment(linker, "/subsystem:console") si realmente desea seguir esta ruta.

+2

Esta es definitivamente la mejor respuesta, ya que responde directamente a la pregunta original de especificar manualmente el sistema y dejar que el vinculador lo determine (o cambiar la configuración del proyecto). –

+0

¿Cómo/dónde se define '_CONSOLE'? – jww

3

Así no es como funciona realmente. Tienes que escribir un código dramáticamente diferente en una aplicación de consola frente a una aplicación nativa de Windows. En una aplicación de consola, utiliza printf o cout para producir resultados, no tiene mucho si se usa para un mouse. Una aplicación nativa de Windows requiere un bucle de mensajes y la creación de una ventana con un procedimiento de ventana que detecta el mensaje WM_PAINT para actualizar la ventana. Etcétera

Pero puede escribir el código que hace ambas cosas. Simplemente escriba una función main() y una función WinMain(), la CRT llamará automáticamente a la correcta.

+0

+1: escribo ambas funciones. – Puppy

+1

Si bien las declaraciones que hizo son ciertas, no cuentan toda la historia. Es posible escribir una aplicación que funcione con o sin el subsistema de la consola a través de algunos pequeños tweeks. Normalmente, esta sería una aplicación sin ventanas (o simplemente puede llamar a MessageBox) y no tiene ningún subproceso de interfaz de usuario. Los tubos estándar también están disponibles para aplicaciones que no son de consola, aunque, por supuesto, su salida no se verá a menos que se redirija. – Tergiver

+2

De hecho. Todas mis aplicaciones son aplicaciones de consola en la compilación de depuración, y básicamente son 6 líneas de código extra: una función principal que 'devuelve WinMain (0,0,0,0)', todo dentro de '#ifdef _CONSOLE'. Ni siquiera necesitas el '# ifdef'. –

Cuestiones relacionadas