wwinmain example c++ visual-c++ macros character-encoding tchar

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.