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
Respuesta
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.
_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.
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). –
¿Cómo/dónde se define '_CONSOLE'? – jww
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.
+1: escribo ambas funciones. – Puppy
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
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'. –
- 1. diferencia entre Console (/ SUBSYSTEM: CONSOLE) y Windows (/ SUBSYSTEM: WINDOWS)
- 2. ¿Hay un #define para C99?
- 3. ¿Hay un tamaño de búfer asociado a stdout?
- 4. Erlang: obtener el "nombre registrado" asociado con un `pid`
- 5. ¿Cómo obtengo el ícono asociado con un tipo de archivo?
- 6. Cómo abrir un archivo con el programa asociado predeterminado
- 7. Efectos de cambiar entre/SUBSYSTEM: CONSOLE a/SUBSYSTEM: WINDOWS en una DLL
- 8. ¿Un archivo en git asociado con el repositorio, bajo control de revisión, pero no asociado con ninguna rama en particular?
- 9. error multihilo: Ya hay un DataReader abierto asociado con esta conexión que debe estar cerrada primera
- 10. Ya hay un DataReader abierto asociado con este comando que debe cerrarse primero
- 11. Excepción: Ya hay un DataReader abierto asociado con esta conexión que debe estar cerrada primera
- 12. error 'ya hay un DataReader abierto asociado con este comando que debe estar cerrada primer'
- 13. Entity Framework: Ya hay un DataReader abierto asociado con este comando que debe estar cerrada primera
- 14. Consiga el modelo asociado con la correspondiente vista en HtmlHelper
- 15. ¿Cómo se asigna el almacenamiento asociado con std :: future?
- 16. Un objeto diferente con el mismo identificador ya estaba asociado con el error de sesión
- 17. ¿Hay alguna manera de hacer un #define dentro de otro #define?
- 18. ¿Hay un #define para 64 bit en Visual Studio 2010?
- 19. XSLT: valor de texto asociado con el elemento
- 20. Knockout.js obtener el objeto dom asociado con los datos
- 21. ¿Qué significa el valor # asociado con la instrucción ARM LDR?
- 22. error de símbolo duplicado asociado con const char * [] declaración
- 23. Cómo obtener el nombre asociado con MANIJA abierta
- 24. ¿Cuál es el costo de un #define?
- 25. Performance Overhead of Perf Event Subsystem en Linux Kernel
- 26. ¿Hay alguna manera de usar fopen_s() con GCC o al menos crear un #define al respecto?
- 27. Cómo cambiar el valor del campo asociado
- 28. cómo validar el id del modelo asociado?
- 29. ¿Cómo se puede abrir un archivo con el programa asociado a su extensión de archivo?
- 30. ¿Cómo puedo obtener el nombre/índice de la interfaz asociado con un socket TCP?
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'. –