2010-12-30 16 views
11

El título lo dice todo. ¿Se ha estandarizado #pragma once para C++ 0x? No conozco ningún compilador que no proporcione una implementación del mismo, con casi siempre la misma semántica y nombre.¿Pasó `#pragma una vez` a C++ 0x?

+1

Consulte esto para obtener [en '#pragma una vez'] (http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard/1946730#1946730) – Motti

+0

"Casi "¿?" ¿Estás bien usándolo en diferentes compiladores que no lo tratan de forma idéntica? O, ¿con qué otros nombres lo conoces? (No está claro a cuál se aplica "casi", o ambos?) –

Respuesta

13

Todas las directivas #pragma hacen que la implementación se comporte de una manera definida por la implementación.

Esto no ha cambiado entre C++ 03 y el último borrador de C++ 0x (n3225.pdf). Incluir guardias es la alternativa portátil.

+1

Sé que los protectores son la alternativa portátil, pero pensé que podría haber sido estandarizada de todos modos. – Klaim

+0

Tenga en cuenta que el último borrador es n3225.pdf. –

+1

@Prasoon: Así es. En mi defensa, el "borrador actual" en la página web del WG21 no está actualizado. http://www.open-std.org/jtc1/sc22/wg21/ –

6

El compilador Sun C++ (Solaris) no lo implementa. Y no, no está en los borradores C++ 0x.

+0

+1 para la información. – Klaim

-2

También es trivial de implementar con #ifdef. ¿Cuál es el principio rector de la nueva versión? ¿Implementa todo lo que puedas desear y el fregadero de la cocina o simplemente te da las herramientas mínimas para hacerlo tú mismo?

+8

Te estás perdiendo el punto. Una gran parte de la sandardización es hacer que la práctica común sea el mínimo disponible para las herramientas que cumplen con los estándares. Como '#pragma once' ES proporcionado por muchos compiladores y se ha demostrado que es útil. Una palabra clave equivalente estandarizada hubiera sido útil. – Klaim

+6

incluye guardias que le obligan a elegir nombres en el espacio de nombres del preprocesador (uno y único global). que es un dolor Concedido, la mayoría de los proyectos necesitan macros en alguna parte, por lo que tienen que lidiar con el problema de elegir identificadores de preprocesador sin causar colisiones de todos modos. sin embargo, es un dolor, y todavía veo una gran cantidad de código #ifdef FILENAME_H volando alrededor. que es ARGH la mayoría de los proyectos razonables usan PROJECTNAME_FILENAME_SOMESUFFIX, que es OKish, pero bueno .... IMO #pragma una vez es la mejor solución. –