c++ - página - #include formato de protector de encabezado?
meta tags para wix (13)
Para evitar las colisiones de nombres, utilizo GUID:
#ifndef GUARD_8D419A5B_4AC2_4C34_B16E_2E5199F262ED
Sé que tiene poca importancia para un proyecto pero, suponiendo que use #defined guardias de encabezado para su código C ++, ¿qué formato usa? por ejemplo, asumiendo un encabezado llamado foo.hpp
:
#ifndef __FOO_HPP__
...
#ifndef INCLUDED_FOO_HPP
...
#ifndef SOME_OTHER_FORMAT
Estoy convencido de la idea de #defines en mayúsculas, pero no puedo conformarme con un formato para estos guardias.
Personalmente, solo uso el nombre de archivo FOO_HPP. Google usa la ruta completa como SRC_ENGINE_FAST_HPP.
Ciertos conjuntos de nombres y firmas de funciones siempre se reservan para la implementación:
- Cada nombre que contiene un guion bajo doble (_ _) o comienza con un guion bajo seguido de una letra mayúscula (2.11) se reserva para la implementación para cualquier uso.
- Cada nombre que comienza con un guión bajo está reservado a la implementación para su uso como nombre en el espacio de nombres global.
( 17.4.3.1.2/1
)
Prefiero este formato:
#ifndef FOO_HPP
#define FOO_HPP
/* ... */
#endif // FOO_HPP
- Un simple #ifndef en lugar de #if! Defined (...) , porque rara vez tiene sentido usar una condición compleja para un protector de encabezado.
- La parte _HPP para marcar el identificador como protector de encabezado.
- No hay guiones bajos destacados, porque dichos identificadores (que comienzan con 2 guiones bajos o con 1 guion bajo y mayúscula) se reservan para la implementación.
- La parte base es solo el nombre del archivo, FOO . Sin embargo, para el código de la biblioteca que se va a reutilizar, es aconsejable agregar otra parte al principio. Este suele ser el espacio de nombres que lo contiene o el nombre del "módulo", por ejemplo,
MYLIB_FOO_HPP
, y ayuda a evitar conflictos de nombres.
Si está usando Visual Studio o un compilador de Microsoft, use la forma pragma
#pragma once
También siempre he usado algo como:
#ifndef FOO_HPP
#define FOO_HPP 1
...
#endif
Como la mayoría de la gente ha mencionado, no anteponga símbolos con doble guión bajo, ya que está reservado por el estándar C ++ para uso interno de la implementación.
Tal vez desee consultar el excelente libro de John Lakos "Diseño de software de C ++ a gran escala" ( enlace de Amazon - desinfectado para el script kiddy link nazis) para algunas consideraciones sobre el encabezado.
HTH
aclamaciones,
Robar
Tiendo a usar:
#ifndef FILE_DATE_H_
(reemplace _H_ con la extensión apropiada como _HPP_, etc.). El sello de fecha es para evitar colisiones con otros mismos encabezados con nombre en otras direcciones / bibliotecas.
así que al final se ve así:
#ifndef SOMEFILE_20082411_H_
Yo siempre uso INCLUDED_FOO_HPP
No utilizaría el subrayado doble, ya que está reservado el inicio de las cosas con guiones bajos dobles.
Yo uso siempre el uso
#ifndef FOOBAR_CPP
yo suelo
#if !defined(FOO_HPP_INCLUDED)
Prefiero la sintaxis defined
moderna porque permite || && operadores, incluso si no se usan aquí.
también
#ifndef __FOO_HPP__
es técnicamente ilegal, ya que los guiones bajos principales están reservados.
Cuando me pagan por mi tiempo y todavía no hay un estándar de la compañía, utilizo:
#ifndef path_to_file_h
#define path_to_file_h
El motivo de la letra minúscula es que es más fácil copiar y pegar nombres de archivo y reemplazar barras con guiones bajos. La razón de #ifndef es que se alinea muy bien con #define, lo que facilita ver que los símbolos son los mismos. Sin embargo, me gusta la idea del GUID, así que podría probarlo.
Cuando no me pagan por mi tiempo y no lanzo mi código en libertad, solo uso #pragma once
. A diferencia de la mayoría de los demás problemas de portabilidad, es tan fácil agregar guardias más adelante como ahora, y puede hacerlo alguien que no sabe nada sobre el código base (por ejemplo, yo en un año o algún programador inocente al que le envíe mi código) , entonces YAGNI aplica.
yo suelo
<FILENAME_IN_ALL_CAPS>_<YYYYMMDD>
o
<FILENAME_IN_ALL_CAPS>_INCLUDED_<YYYYMMDD>
Mantenerlo sincronizado con las jerarquías de carpetas es demasiado molesto (amigo de la refactorización), los GUID son demasiado molestos, el sufijo de fecha es lo suficientemente bueno . Si tuviera que nombrar igualmente los archivos en el mismo día, lo haría
<FILENAME_IN_ALL_CAPS>_<YYYYMMDD>a
<FILENAME_IN_ALL_CAPS>_<YYYYMMDD>b
<FILENAME_IN_ALL_CAPS>_<YYYYMMDD>...
Siempre incluí el espacio de nombres o la ruta relativa en el protector de inclusión, porque solo el nombre del encabezado solo ha demostrado ser peligroso.
Por ejemplo, tiene algún proyecto grande con los dos archivos en algún lugar de su código
/myproject/module1/misc.h
/myproject/module2/misc.h
Por lo tanto, si utiliza un esquema de nombres coherente para sus guardias de inclusión, puede terminar teniendo _MISC_HPP__
definido en ambos archivos (muy gracioso encontrar tales errores).
Así que me conformé con
MYPROJECT_MODULE1_MISC_H_
MYPROJECT_MODULE2_MISC_H_
Estos nombres son bastante largos, pero en comparación con el dolor de las definiciones dobles, lo vale.
Otra opción, si no necesita la independencia del compilador / plataforma, puede buscar algo de #pragma una vez.
Me gustaría ir con el filepath + el sufijo _INCLUDED
sufijo más el actualmente ampliamente apoyado #pragma once
En muchos editores (para mí es sublime) también puedes definir algunas macros / fragmentos para esto.
Aquí hay uno que lo hace por usted:
<snippet>
<content><![CDATA[
#ifndef ${1:${TM_FILEPATH/(.*//(include|src))*([^a-zA-Z0-9_]+)*([a-zA-Z0-9_]+)([.])*([a-zA-Z0-9_]+)*//U$4_$6/ig}_INCLUDED}
#define $1
#pragma once
$0
#endif // $1
]]></content>
<tabTrigger>incguard</tabTrigger>
<description>include guard</description>
</snippet>
entonces su yourproject/include/yourlib/yourfile.hpp
se convierte en YOURLIB_YOURFILE_HPP_INCLUDED
Una herramienta adicional de verificación del estilo del código fuente externo podría rastrear fácilmente la consistencia de sus guardias de esta manera.