Portabilidad de la directiva de preprocesador #warning

Sé que la directiva #warning no es estándar C / C ++, pero varios comstackdores lo admiten, incluyendo gcc / g ++. Pero para aquellos que no lo admiten, ¿lo ignorarán silenciosamente o provocará una falla en la comstackción? En otras palabras, ¿puedo usarlo de forma segura en mi proyecto sin romper la comstackción para comstackdores que no lo admiten?

Es probable que si un comstackdor no admita #warning, emitirá un error. A diferencia de #pragma, no hay ninguna recomendación de que el preprocesador ignore las directivas que no comprende.

Habiendo dicho eso, he usado comstackdores en varias plataformas diferentes (razonablemente comunes) y todas han soportado #warning.

Cabe señalar que MSVC usa la syntax:

 #pragma message ("su texto de advertencia aquí")

La syntax usual de #warning genera un error fatal

 C1021: comando de preprocesador no válido 'advertencia'

por lo que no es portátil para esos comstackdores.

Es probable que reciba al menos una advertencia de directiva no reconocida de comstackdores que no reconocen #warning, incluso si el bloque de código no está incluido en su comstackción. Eso podría o no tratarse como un error, el comstackdor podría tratarlo legítimamente como un error, pero muchos serían más laxos.

¿Conoce (puede nombrar) un comstackdor distinto de GCC / G ++ que proporciona #warning? [ Editado: Sun Solaris 10 (Sparc) y los comstackdores de Studio 11 C / C ++ aceptan #warning.]

Tuve este problema una vez con un comstackdor para un procesador Atmel. Y sí generó errores de preprocesador debido al desconocido token #warning.

Lamentablemente, la solución parecía ser convertir todo el árbol fuente para usar el equivalente de #pragma y aceptar que el comportamiento de comstackción difería si se utilizaba gcc.

En realidad, la mayoría de los comstackdores que conozco ignoran las directivas #pragma desconocidas y envían un mensaje de advertencia, por lo que, en el peor de los casos, seguirás recibiendo una advertencia.

Al cambiar de mingw a visual studio, agregué esas líneas a mi encabezado de configuración global. (incluirlo en stdafx.h)

 #ifdef __GNUC__ //from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html //Instead of put such pragma in code: //#pragma GCC diagnostic ignored "-Wformat" //use: //PRAGMA_GCC(diagnostic ignored "-Wformat") #define DO_PRAGMA(x) _Pragma (#x) #define PRAGMA_GCC(x) DO_PRAGMA(GCC #x) #define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x) #define PRAGMA_WARNING(x) DO_PRAGMA(warning #x) #endif //__GNUC__ #ifdef _MSC_VER /* #define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off)) // These two lines are equivalent #pragma optimize("", off) PRAGMA_OPTIMIZE_OFF */ #define PRAGMA_GCC(x) // https://support2.microsoft.com/kb/155196?wa=wsignin1.0 #define __STR2__(x) #x #define __STR1__(x) __STR2__(x) #define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") " #define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x)) #define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x)) #endif //#pragma message "message quoted" //#pragma message message unquoted //#warning warning unquoted //#warning "warning quoted" PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted) PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted") #warning "#pragma warning quoted" PRAGMA_WARNING(PRAGMA_WARNING unquoted) PRAGMA_WARNING("PRAGMA_WARNING quoted") 

Ahora uso PRAGMA_WARNING (esto necesita ser arreglado)

Lamentablemente, no hay ninguna #pragma warning en gcc, por lo que advierte pragma no especificado.

Dudo que gcc agregue #pragma warning" lugar de Microsoft agregando #warning .