2011-02-08 18 views
7

Soy nuevo en la codificación C++, proveniente de Java y C# de fondo. Estoy sorprendido por la proliferación de términos #define empezando por la más básica:¿Por qué hay una macro que define _tmain?

#define _tmain wmain 

Cuando supe por primera vez hace más de un puñado de edades C, la función principal era:

int main(int argc, char *argv[]) 

En el Visual C++ proyecto que he creado, que hizo que la función principal:

int _tmain(int argc, _TCHAR* argv[]) 

me pregunto por qué tenía que haber una traducción de nombres de wmain a _tmain? ¿Por qué no utilizar el prototipo de función C main original?

En general, parece haber una gran cantidad de #define cambiando el nombre de algo que parece bastante claro para empezar, a algo que se ve más misterioso y menos claro (me refiero a wmain a _tmain ??).

Gracias por tolerar lo que puede ser una pregunta muy obvia.

+7

Eso es algo específico de Windows, no tiene nada que ver con Standard C++ (ni C). Ellos (en Microsoft) tienen una mala costumbre de esquemas de nombres horribles y complicar las cosas innecesariamente. –

+2

Érase una vez, alguien pensó que esta era una buena idea para ayudar a las personas a migrar desde versiones anteriores de Windows usando char a más nuevo una vez que usaran wchar_t. ¡No lo era, y ahora solo confunde a la gente! –

+1

Relacionados: http://stackoverflow.com/questions/234365/is-tchar-still-relevant – dan04

Respuesta

13

Esta es una característica específica de Visual C++, no es parte de C++.

La mayor parte de las funciones de la API de Windows tienen dos versiones: los que terminan en W, que son para su uso con cadenas de caracteres anchos (wchar_t cadenas) y las que terminan en A, que son para su uso con cadenas de caracteres estrechos (char cuerdas) 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 T nombres (como _TCHAR y _tmain) son para el mismo propósito: son macros que se expanden para el nombre correcto dependiendo de sus ajustes de compilación, por lo wchar_t y wmain para el apoyo de caracteres anchos o char y main de carácter estrecho apoyo.

La idea es que si escribe su código utilizando los nombres agnósticos de caracteres (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.

+0

Muchas gracias. Esa es una gran visión general.Desde un punto de vista práctico, ¿la mayoría de los desarrolladores intentan evitar las convenciones de Visual C++ para seguir con C++ estándar, o es la suposición de que si está desarrollando en Windows, simplemente use las convenciones de Visual C++? –

+0

@Sam: Eso depende. Si está escribiendo código que hace un uso intensivo de la API de Windows, puede ser muy útil que use 'TCHAR' y sus amigos. Si está escribiendo código que necesita ser portable en múltiples plataformas, entonces no desea usar 'TCHAR' y sus amigos. He hecho muy poca programación de C++ específica de Windows, así que probablemente no soy la mejor persona para preguntar. Todos los proyectos principales en los que he trabajado en C++ han tenido portabilidad como requisito principal. –

+2

@Sam: como dice que es nuevo en la programación en C++, le recomiendo encarecidamente que primero aprenda a escribir C++ portátil y aprenda a evitar las extensiones de idioma y las características específicas de la plataforma siempre que sea posible. Intente escribir código dependiente de la plataforma solo cuando debe (por ejemplo, cuando tiene que interoperar con el sistema operativo o usar funcionalidades a las que no se puede acceder a través de la Biblioteca estándar de C++). Cuando tenga que usar un código específico de la plataforma, trate de aislarlo tanto como sea posible para que pueda transferir el código fácilmente a otras plataformas, si es necesario. –

5

Debido a que Microsoft decidió que la mejor manera de añadir soporte Unicode para C++ fue añadir un tipo de TCHAR, que se #defined a cualquiera char o wchar_t dependiendo del valor del proyecto Propiedades Propiedades> Configuración> General> Juego de caracteres. _tmain también está #defined a main (que toma char s) o wmain (que toma wchar_t s) dependiendo de esa configuración.

+0

¡Realmente útil para saber! Gracias. –

+2

@Sam: Desafortunadamente, el grupo del sistema operativo Windows son especialistas en C, por lo que utilizaron #define en lugar de typedef y macros en lugar de funciones en línea. Esto introdujo miles de desagradables macros en los encabezados de Windows, que notará cuando uno de ellos coincida accidentalmente con uno de los nombres de sus funciones. :-( –

+1

Los desarrolladores de Unix, por otro lado, decidieron que la mejor manera de agregar soporte Unicode a C++ era usar UTF-8. – dan04

Cuestiones relacionadas