2011-07-13 8 views
8

Estoy incluyendo windows.h en uno de mis archivos h (para usar CaptureStackBackTrace), en un proyecto de Visual Studio. Al principio obtuve algunos errores del compilador debido al uso de los métodos st/max std y la macro con el mismo nombre en windows.h, pero esto parece estar resuelto por #define NOMINMAX, como he leído en otras publicaciones de SO. (Digo "parece" porque no puedo estar seguro hasta que todo mi proyecto vuelva a funcionar bien).incluyendo windows.h causa chocar con nombre de variable local

El problema es que algunos nombres de variables locales ahora rompen la compilación. La línea:

int grp1; 

dentro de un método de clase, hace que el siguiente error:

error C2143: syntax error : missing ';' before 'constant' 

mientras que el archivo CPP compila bien si cambio el nombre de la variable a grp1_.

Por supuesto que puedo cambiar el nombre de la variable, pero sin embargo, tengo la sensación de que estoy haciendo algo mal, ¿no? ¿O es este un problema conocido al incluir windows.h? ¿Hay alguna otra solución más elegante que no sea cambiar el nombre de la variable?

Respuesta

10

Dlg.h contiene la línea

#define grp1  0x0430 

Se podría excluirlo definiendo WIN32_LEAN_AND_MEAN.

+2

Si está en un encabezado que planea distribuir, probablemente sea una buena idea evitar el nombramiento colisión en caso de que el usuario necesite 'dlgs.h'. De lo contrario, debería agregar 'WIN32_LEAN_AND_MEAN' a todos sus proyectos. Ahorra tiempo de compilación y se deshace de algunas cosas molestas como esta. –

1

Bueno, GRP1 se define como por lo que en dlgs.h:

#define grp1  0x0430 

y dlgs.h está incluido en windows.h, por lo tanto el choque.

Puede #undef grp1 después de #include <windows.h>. No es el sitio más bonito, pero si incluye windows.h solo una vez, puede mantener esas correcciones en un solo lugar.

3

Hasta cierto punto, es un problema con todos los encabezados de biblioteca. Los nombres de reserva de C y C++ comienzan con _ para la implementación (de la biblioteca estándar). Otras bibliotecas están solas. Uno esperaría un namespace, o si la biblioteca debe ser compilable en C, algún tipo de convención de nombres, como un prefijo, pero ni Windows ni Posix lo hacen. (En los primeros días, los encabezados para X contenían un #define String, lo que causaba problemas con otras bibliotecas).

Al final, no hay una buena solución. Solo tienes que esperar hasta que te golpee y luego cambiar el nombre de tu función. (windows.h es particularmente malo, porque la mayoría de las funciones “ ” en él son de hecho macros, y no obedecen al alcance.)

Cuestiones relacionadas