c++ - installed - instalar clang windows
¿Cómo deshabilitar una advertencia#pragma desconocida en particular?(GCC y/o clang) (3)
Sé cómo deshabilitar todas las advertencias de #pragma desconocidas. La respuesta se dio, por ejemplo, aquí: SO: ¿Cómo deshabilitar las advertencias de #pragma?
Mi pregunta es: ¿hay una manera de deshabilitar una advertencia de ''pragma desconocido'' para un pragma en particular? Por ejemplo, si deshabilito la advertencia para #pragma ugubugu
el siguiente código:
#pragma ugubugu
#pragma untiunti
int main() {return 0;}
cuando se compila con:
g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall
debe producir una sola advertencia:
warning: ignoring #pragma untiunti
Tal vez, por ejemplo, hay una forma sencilla de registrar un pragma personalizado que no haría nada.
Sería genial saber si existe una opción como Visual Studio también, pero eso es menos importante.
¡Gracias!
"¿Pero por qué en última instancia está jugando con pragmas personalizados?"
Mi fuente es analizada por dos compiladores. En uno de esos, hay un #pragma
especial, que es desconocido para el otro. Por supuesto, probablemente podría colocar #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif
alrededor de cada instancia del #pragma
pero eso sería engorroso.
Estoy razonablemente seguro de que no hay manera de hacer esto.
Tanto GCC como Clang tienen interfaces internas que permiten que la interfaz de lenguaje registre #pragma
handlers con el preprocesador (vea libcpp/directives.c
GCC y lib/Lex/Pragma.cpp
) pero, por lo que puedo ver, hay nada que le permita modificar qué controladores están registrados (más allá de lo que implica la variante de idioma que está compilando) en función de las opciones de la línea de comandos.
Sé cómo deshabilitar todas las advertencias de #pragma desconocidas. La respuesta se dio, por ejemplo, aquí: SO: ¿Cómo deshabilitar las advertencias de #pragma?
Tenga en cuenta que la respuesta más votada es mejor que la aceptada allí. -Wno-unknown-pragmas
se pueden agregar simplemente en la línea de comandos después de cualquier cosa (como -Wall
) que -Wall
la advertencia.
Mi fuente es analizada por dos compiladores. En uno de esos, hay un
#pragma
especial, que es desconocido para el otro. Por supuesto, probablemente podría colocar#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif
alrededor de cada instancia del#pragma
pero eso sería engorroso.
Desde un punto de vista más filisófico, creo que esta es realmente la solución correcta, aunque puede ser incómoda.
Me parece correcto ocultar cualquier #pragma
de un compilador que no se espera que lo entienda de la manera que usted pretende, dado que todo el punto de #pragma
es proporcionar un mecanismo para invocar el comportamiento definido por la implementación en el compilador.
(Si terminas haciendo esto, ten en cuenta que Clang define __clang__
, pero tanto GCC como Clang definen __GNUC__
).
Supongo que desea deshabilitar las advertencias de pragma porque es algo que es válido en una plataforma pero no en otra. Si ese es el caso, puede usar macros para habilitar selectivamente el pragma, eliminando la necesidad de suprimir la advertencia.
Por ejemplo, si solo desea el pragma en Visual C ++, puede hacer:
#if defined(_MSC_VER)
# define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu)
#else
# define SAFE_PRAGMA_UGUBUGU
#endif
Y luego, puedes escribir
SAFE_PRAGMA_UGUBUGU
#pragma untiunti
int main() {return 0;}
- Los compiladores no permiten pragmas personalizados porque los pragmas son (en su mayoría) directivas de control del compilador y / o del enlazador. Dado que esto está muy cerca de una implementación y características particulares del compilador, ¿cuál sería la aplicación de "definir nuevos pragmas" para el usuario? De hecho, las directivas pragma disponibles que se implementan en un compilador particular son totalmente independientes del proveedor (no hay una regla de estandarización de C ++).
- Es posible que desee utilizar pragmas para marcar secciones especiales de su código (por ejemplo, para alimentar a su propio preprocesador) ya que está solicitando directivas no operativas. Esto se puede hacer usando el preprocesador (#defines).
- Otra posibilidad para el "marcado" personalizado en el código C / C ++, por ejemplo: #MY_PRAGMA, es usar su propio preprocesador antes que el C / C ++.
Un ejemplo de este tipo de procesamiento se utiliza para la biblioteca QT, un sistema de metobjetos no estándar que interactúa con el compilador Qt MOC. Esto se usa para expandir algunas construcciones que no son C ++ (por ejemplo, Q_OBJECT, Q_PROPERTY, etc.) que luego se alimenta con una sintaxis válida para el compilador de C ++.