Directives pragma y la palabra clave __pragma

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Las directivas pragma especifican características del compilador específicas del equipo o del funcionamiento. La palabra clave __pragma, que es específica del compilador de Microsoft, permite la codificación de directivas pragma dentro de definiciones de macro.

  
      #pragma token-string  
__pragma(token-string)  

Cada implementación de C y C++ admite algunas características exclusivas del equipo host o del sistema operativo. Algunos programas, por ejemplo, deben realizar el control preciso sobre las áreas de memoria donde se colocan los datos o controlar la manera en que determinadas funciones reciben los parámetros. Las directivas #pragma proporcionan un método para que cada compilador ofrezca características específicas del equipo o del sistema operativo a la vez que conservan la compatibilidad total con los lenguajes C y C++.

Las pragmas son específicas del equipo o del sistema operativo específico por definición, y normalmente son diferentes para cada compilador. Las pragmas se pueden utilizar en instrucciones condicionales, para proporcionar nueva funcionalidad de preprocesador, o para proporcionar información que se define en la implementación al compilador.

token-string es una serie de caracteres que proporcionan instrucciones del compilador y argumentos concretos, si los hay. El signo de número (#) debe ser el primer carácter que no es un espacio en blanco de la línea que contiene la pragma; los caracteres de espacio en blanco pueden separar el signo de número y la palabra "pragma". A continuación de #pragma, se ha de escribir el texto que el traductor pueda analizar como tokens de preprocesamiento. El argumento para #pragma está sujeto a la expansión de macro.

Si el compilador encuentra una pragma que no reconoce, emite una advertencia y continúa la compilación.

Los compiladores de Microsoft C y C++ reconocen las pragmas siguientes:

alloc_textauto_inlinebss_seg
check_stackcode_segcomment
componentconform 1const_seg
data_segdeprecateddetect_mismatch
fenv_accessfloat_controlfp_contract
functionhdrstopinclude_alias
init_seg 1inline_depthinline_recursion
intrinsicloop 1make_public
managedmessage
omponce
optimizepackpointers_to_members 1
pop_macropush_macroregion, endregion
runtime_checkssectionsetlocale
strict_gs_checkunmanagedvtordisp 1
warning
  1. Solo la admite el compilador de C++.

Algunas pragmas proporcionan la misma funcionalidad que las opciones del compilador. Cuando una pragma se encuentra en el código fuente, invalida el comportamiento especificado por la opción del compilador. Por ejemplo, si se ha especificado /Zp8, se puede reemplazar esta configuración del compilador para secciones específicas del código con pack:

cl /Zp8 ...  
  
<file> - packing is 8  
// ...  
#pragma pack(push, 1) - packing is now 1  
// ...  
#pragma pack(pop) - packing is 8  
</file>  

Específicos de Microsoft

El compilador también admite la palabra clave __pragma, que tiene la misma funcionalidad que la directiva #pragma, pero puede utilizarse alineada en una definición de macro. La directiva #pragma no se puede utilizar en una definición de macro porque el compilador interpreta el carácter de signo de número ("#") en la directiva como operador de generación de cadenas (#).

En el siguiente ejemplo de código se muestra cómo se puede utilizar la palabra clave __pragma en una macro. Este código se ha extraído del encabezado mfcdual.h del ejemplo ACDUAL en "Ejemplos de compatibilidad COM del compilador":

#define CATCH_ALL_DUAL \  
CATCH(COleException, e) \  
{ \  
_hr = e->m_sc; \  
} \  
AND_CATCH_ALL(e) \  
{ \  
__pragma(warning(push)) \  
__pragma(warning(disable:6246)) /*disable _ctlState prefast warning*/ \  
AFX_MANAGE_STATE(pThis->m_pModuleState); \  
__pragma(warning(pop)) \  
_hr = DualHandleException(_riidSource, e); \  
} \  
END_CATCH_ALL \  
return _hr; \  

Fin de Específicos de Microsoft

Referencia del preprocesador de C/C++
Pragmas de C
Palabras clave de C++

Mostrar: