library c++ c++11 macros header-files c++14

library - Es#pragma una vez parte del estándar C++ 11?



c++ libraries (2)

Tradicionalmente, la forma estándar y portátil de evitar múltiples inclusiones de encabezado en C ++ era / es utilizar el esquema de directivas #ifndef - #define - #endif también denominado esquema de #ifndef - #define - #endif (vea el fragmento de código a continuación).

#ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif

Sin embargo, en la mayoría de las implementaciones / compiladores (ver la imagen a continuación), existe una alternativa más "elegante" que sirve para el mismo propósito que el esquema de #pragma once llamado #pragma once . #pragma once tiene varias ventajas en comparación con el esquema de macroguarda, que incluye menos código, evitar conflictos de nombres y, a veces, mejorar la velocidad de compilación.

Investigando un poco, me di cuenta de que, aunque la directiva #pragma once es compatible con casi todos los compiladores conocidos, existe una turbidez en cuanto a si la directiva # pragma #pragma once es parte del estándar C ++ 11 o no.

Preguntas:

  • ¿Podría alguien aclarar si la directiva #pragma once es parte del estándar C ++ 11 o no?
  • Si no es parte del estándar C ++ 11, ¿hay planes de incluirlo en versiones posteriores (p. Ej., C ++ 14 o posterior)?
  • También sería bueno si alguien pudiera profundizar en las ventajas / desventajas al usar cualquiera de las técnicas (es decir, macro-guardia versus #pragma once ).

La Sección §16.6 del Estándar (borrador N3936 ) describe las directivas #pragma como:

Una directiva de preprocesamiento de la forma

# pragma pp-tokensopt new-line

hace que la implementación se comporte de una manera definida por la implementación. El comportamiento puede hacer que la traducción falle o hacer que el traductor o el programa resultante se comporten de una manera no conforme. Cualquier pragma que no sea reconocido por la implementación es ignorado.

Básicamente, #pragma once es una instancia específica de implementación de una directiva #pragma , y no, no es estándar. Todavía.

A menudo es ampliamente respaldado por la mayoría de los "compiladores principales", incluidos GCC y Clang por lo que a veces se recomienda evitar la repetición de "guardias incluidas".


#pragma once no es estándar. Es una extensión generalizada (pero no universal), que se puede usar

  • si sus preocupaciones de portabilidad son limitadas, y
  • puede estar seguro de que todos sus archivos incluidos siempre están en un disco local.

Se consideró para estandarización, pero se rechazó porque no se puede implementar de manera confiable. (Los problemas ocurren cuando tiene archivos accesibles a través de diferentes montajes remotos).

Es bastante fácil garantizar que no haya conflictos de inclusión de guardias dentro de un solo desarrollo. Para las bibliotecas, que pueden ser utilizadas por muchos desarrollos diferentes, la solución obvia es generar una gran cantidad de caracteres aleatorios para el protector de inclusión al crearlo. (Se puede configurar un buen editor para que lo haga por usted cada vez que abra un nuevo encabezado.) Pero incluso sin esto, aún no he encontrado ningún problema con los conflictos entre las bibliotecas.