c++ - wwinmain - createwindow example
¿Por qué hay una macro que define_tmain? (2)
Soy nuevo en la codificación C ++, proveniente de Java y C # de fondo. Estoy desconcertado por la proliferación de #definir términos que comienzan con los más básicos:
#define _tmain wmain
La primera vez que aprendí algo de C hace siglos, la función principal era:
int main(int argc, char *argv[])
En el proyecto de Visual C ++ que creé, hizo la función principal:
int _tmain(int argc, _TCHAR* argv[])
Me pregunto por qué tenía que haber una traducción de nombre de wmain
a _tmain
. ¿Por qué no usar el prototipo original de la función main
C?
En general, parece que hay una gran cantidad de definición de #define algo que parece bastante claro para empezar, a algo que se ve más misterioso y menos claro (me refiero a wmain
to _tmain
).
Gracias por tolerar lo que puede ser una pregunta muy obvia.
Debido a que Microsoft decidió que la mejor manera de agregar soporte Unicode a C ++ era agregar un tipo de TCHAR
, que es #defined a char
o wchar_t
dependiendo del valor de Propiedades del proyecto> Propiedades de configuración> General> Conjunto de caracteres. _tmain
también está _tmain
definido en main
(que toma char
s) o wmain
(que toma wchar_t
s) dependiendo de esa configuración.
Esta es una característica específica de Visual C ++, no es parte de C ++.
La mayoría de las funciones API de Windows tienen dos versiones: las que terminan en W
, que se utilizan con cadenas de caracteres anchas (cadenas wchar_t
) y las que terminan en A
, que se utilizan con cadenas de caracteres angostas (cadenas de caracteres). Las "funciones" reales de la API de Windows no tienen ningún sufijo y se definen como macros que se expanden a la versión correcta según la configuración.
Los nombres T
(como _TCHAR
y _tmain
) son para el mismo propósito: son macros que se expanden al nombre correcto según su configuración de compilación, por lo que wchar_t
y wmain
para soporte de caracteres anchos, o char
y main
para compatibilidad de caracteres angostos.
La idea es que si escribe su código usando los nombres agnósticos de tipo de carácter (los nombres T
), puede compilar su código para usar caracteres angostos (ASCII) o caracteres anchos (Unicode) sin cambiarlo. La compensación es que su código es menos portátil.