advertencias del usuario en msvc AND gcc?
visual-c++ user-warning (4)
Guárdelos con #if declaraciones. Busque un símbolo definido por un compilador pero no por el otro.
#ifdef _MSC_VER
#pragma NOTE(my warning here)
#else
#warning(my warning here)
#endif
Algo feo, pero no veo otra manera.
En MSVC tengo esto en un encabezado:
#define STR(x) #x
#define STR2(x) STR(x)
#define NOTE(text) message (__FILE__ "(" STR2(__LINE__) ") : -NOTE- " #text)
#define noteMacro(text) message (__FILE__ "(" STR2(__LINE__) ") : " STR2(text))
y yo hago
#pragma NOTE(my warning here)
GCC tiene:
#warning(my warning here)
Sin embargo, MSVC (2003) arroja un ajuste cuando ve #warning
y da "error fatal C1021: comando de preprocesador no válido ''advertencia''"
¿Qué puedo hacer sobre esto? ¿Hay alguna manera de que GCC reconozca las advertencias de MSVC o que MSVC no arroje un error sobre las advertencias de GCC? ¿Hay algo que pueda hacer que funcione en ambos? Puedo hacer que GCC me advierta sobre pragmas desconocidos, pero esa no es la solución más ideal.
La mejor solución que he encontrado para este problema es tener lo siguiente en un encabezado común:
// compiler_warning.h
#define STRINGISE_IMPL(x) #x
#define STRINGISE(x) STRINGISE_IMPL(x)
// Use: #pragma message WARN("My message")
#if _MSC_VER
# define FILE_LINE_LINK __FILE__ "(" STRINGISE(__LINE__) ") : "
# define WARN(exp) (FILE_LINE_LINK "WARNING: " exp)
#else//__GNUC__ - may need other defines for different compilers
# define WARN(exp) ("WARNING: " exp)
#endif
Entonces usa
#pragma message WARN("your warning message here")
a lo largo del código en lugar de # advertencia
En MSVC, recibirá un mensaje como este:
c:/programming/some_file.cpp(3) : WARNING: your warning message here
En gcc obtendrás:
c:/programming/some_file.cpp:25: note: #pragma message: WARNING: your warning message here
No es perfecto, pero es un compromiso razonable.
Si lo desea, puede agregar algo a las soluciones anteriores ( #pragma warning
) antes de su #pragma message
:
#pragma warning()
#pragma message(" SOME USER WARNING - FILE LINE etc... ")
Este pequeño complemento genera una advertencia real y no se ve mal en la ventana de VC. Por ejemplo:
1>e:/proj/file.h(19) : warning C4615: #pragma warning : unknown user warning type
1> SOME USER WARNING - FILE LINE etc...
1>proj - 0 error(s), 1 warning(s)
Usualmente uso este método para que las advertencias no sean demasiado silenciosas, como en el código de caso sin la #pragma warning()
.
Por ejemplo, la forma de advertencias es demasiado silenciosa (para mí, por supuesto).
1> SOME USER WARNING - FILE LINE etc..
1>proj - 0 error(s), 0 warning(s)
Sin embargo, solo un pequeño cosmético.
Como ya descubrió, #warning
no es una función estándar, por lo que no puede usarlo con compiladores que no lo soportan. Si desea que su código funcione en todas las plataformas, no usará #warning
en absoluto, o al menos, no en el código que MSVC está destinado a procesar (podría ser preprocesado por #ifdef
o equivalente). Por lo tanto:
#ifdef __GNUC__
#warning(warning message)
#else
#pragma NOTE(warning message)
#endif
Pero eso repite el mensaje y estoy seguro de que tienes en mente no hacerlo, y es voluminoso; solo lo usarías muy pocas veces. También podría necesitar tratar con otros compiladores además de GCC (y no estoy lo suficientemente familiarizado con MSVC como para saber cómo identificarlo de manera confiable).
Sería bueno si #warning
estuviera estandarizado; no está estandarizado en C99.
(Hubo, hace mucho tiempo, una pregunta ASÍ sobre tales características que podrían agregarse a C y #warning
apareció allí).
Ver también: Portabilidad de la directiva del preprocesador de advertencia