2008-11-14 23 views
6

¿Cómo puedo decirle al preprocesador que no reemplace una macro específica?Prevenir el preprocesador C para hacer una macro-sustitución específica

El problema específico es el siguiente: los archivos de encabezado de Windows definen la macro GetMessage.

Mis archivos de encabezado C++ con mi API tienen un método GetMessage. No quiero cambiar el nombre de mi método. Pero al usar la API en Windows, incluyendo windows.h, reemplaza mi llamada al método GetMessage con GetMessageA.

+0

Just doing #undef GetMessage no es bueno, ya que el código que usa la API también usa Windows GetMessage. –

+0

Ah, otro ejemplo del uso indiscriminado de Windows SDK de macros que destruyen todos y cada uno de los espacios de nombres (y no solo en la característica de espacio de nombres de C++). –

+0

@vincent: ver don.El comentario de newfeld en la respuesta '#undef GetMessage' de ShoeLace –

Respuesta

6

has necesitado sólo hacer un

#undef GetMessage

o incluso

#ifdef GetMessage 
#undef GetMessage 
#endif

y luego llamar a las ventanas o GetMessageA GetMessageW directamente, lo que sea apropiado.

que debe saber si está utilizando char * para wchar_t8 ..

(don.neufeld gracias)

Brian también dice que Jus Algunas informaciones útiles, también puede utilizar el push_macro #pragma/pop_macro para hacer push y pop definiciones de macro. Esto es grande si desea anular una definición de macro en un bloque de código:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Sospecho que esto es una característica específica de MS sin embargo, así que tenlo en cuenta.

+0

Pero luego no puedo usar Windows GetMessage más –

+0

Sí, puede, simplemente llame a GetMessageA o GetMessageW directamente, lo que sea apropiado. –

+0

Y, sí, push_macro y pop_macro son específicos de MS. Los pragmas están definidos por implementación por definición, y no he notado estos fuera del código MS. Por supuesto, esto puede no ser un problema para alguien que codifica la API de Windows. –

1

¿Hay un código que llame tanto a GetMessage como a GetMessage de Windows?

Dicho código no podrá diferenciar entre los dos. No podrá llamar a ambos en el mismo archivo.

Si usa una función en un archivo y la otra en otro, simplemente haga el #undef sugerido en un archivo.

0

Teniendo en cuenta sus limitaciones como se indica en su comentario, la única manera de hacer esto es hacer un:

#undef GetMessage 

justo antes de la llamada a GetMessage de su API. (Y esto supone que nadie después de este punto en el archivo de origen está llamando a la Win32 GetMessage.)

+0

Esa no es la única forma, pero requeriría que NO incluya windows.h. :) –

6

(GetMessage)(...)

GetMessage on MSDN

+0

Si bien esto a menudo sería una buena forma de evitar que una macro lo golpee involuntariamente, no creo que funcione para GetMessage, ya que no está definido como una macro 'similar a la función'. –

+1

Oh, claro ... esto funciona solo si la función se declara antes que la macro, no después (lo que no creo que esté garantizado). MSN – MSN

4

Jus Algunas informaciones útiles, también se puede usar el pragma push_macro/pop_macro para empujar y pop definiciones de macro. Esto es grande si desea anular una definición de macro en un bloque de código:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Sospecho que esto es una característica específica de MS sin embargo, así que tenlo en cuenta.

+0

MS específico no debería ser un problema ya que el problema está en una macro definida por windows.h :-P –

+0

Es un problema porque hay suites de compilador no MS dirigidas a Windows (por ejemplo, mingw). – CesarB

Cuestiones relacionadas