Pregunta

¿Cómo se incluyen los guardias C ++ típicamente? Tiendo a ver esto mucho:

#ifndef FOO_H
#define FOO_H

// ...

#endif

Sin embargo, no creo que sea muy intuitivo. Sin ver el nombre del archivo es difícil saber qué FOO_H ¿Está ahí para y a qué se refiere su nombre?

¿Qué se considera la mejor práctica?

¿Fue útil?

Solución

Desde mi propia experiencia, la convención es nombrar a los guardias de inclusión después del archivo de encabezado que los contiene, con la excepción de que el nombre está todo en CAPS y el período se reemplaza con un bajo.

Asi que test.h convertirse en TEST_H.

Ejemplos de la vida real de esto incluyen QT Creator, que sigue esta convención cuando la generación automática de archivos de encabezado de clase.

Otros consejos

Personalmente sigo la recomendación de Boost. Quizás es una de las mayores colecciones de bibliotecas C ++ de buena calidad y no tienen problemas.

Va como:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

// include/pet/project/file.hpp
#ifndef PET_PROJECT_FILE_HPP_INCLUDED

cual es:

  • legal (tenga en cuenta que comenzando por _[A-Z] o conteniendo __ no es)
  • fácil de generar
  • Garantizado para ser único (como guardia incluido) dentro de un proyecto (de lo contrario, tiene dos archivos en el mismo lugar)
  • garantizado para no usarse para nada más (si termina otra macro con INCLUDED Estás maltratando para una pelea)

He leído sobre Guid pero esos se ven raros.

Y obviamente, y que implementan todos los compiladores #pragma once (o mejor, #pragma multiple y "una vez" ser el comportamiento predeterminado ...)

Tomado directamente de Guía de estilo de Google:

Todos los archivos de encabezado deben tener #Define Guards para evitar la inclusión múltiple. El formato del nombre del símbolo debe seru003CPROJECT> _u003CPATH> _u003CFILE> _H_. Para garantizar la singularidad, deben basarse en el camino completo en el árbol fuente de un proyecto. Por ejemplo, el archivo foo/src/bar/baz.h en el proyecto foo debe tener el siguiente guardia:

 #ifndef FOO_BAR_BAZ_H_
 #define FOO_BAR_BAZ_H_
 ...
 #endif  // FOO_BAR_BAZ_H_

Utilizo este estilo en mis propios proyectos.

Mire el código que #incluye su encabezado.

Si es algo como:

#include "mylib/myheader.h"

mylib/myheader.h ya es un nombre único. Simplemente capitalice y reemplace / y. con _

#define MYLIB_MYHEADER_H

Si tiene dos encabezados en su ruta de inclusión con el mismo nombre en relación con la ruta de inclusión, ya tiene una colisión en ese nivel.

Reemplazar FOO_H con FOO_H_INCLUDED Y está más claro.

Como otros mencionaron antes, una convención muy común es usar la versión en mayúsculas del nombre, y el punto reemplazado por un bajo: foo.h -> foo_h

Sin embargo, esto puede llevar a las colisiones de nombres con nombres simples y/o comunes. Por esta razón, el encabezado autogenerado como el stdafx.h en proyectos visuales de C C ++ no vacíos agregan algunas cadenas aleatorias, como:

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS
#define FOO_H__NsknZfLkajnTFBpHIhKS
#endif

http://www.random.org/strings/ es un generador aleatorio útil para esto.

Además, si el archivo es parte de algún submódulo, o su contenido reside en un espacio de nombres específico, también tiendo a agregar eso a la guardia:

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS

namespace somecomponent
{
  ...
}

#endif

Normalmente uso algo como FOO_H_INCLUDED_. Algunos encabezados (Microsoft) tienen lo que se parece mucho a una representación de cadena de un GUID, pero nunca he necesitado nada tan elaborado.

Por lo general, las personas lo hacen por nombre del archivo para que el código de cada archivo solo se compilue y se agrega una vez. Podrías hacer que lo que quieras, pero casi todo lo que he codificado o visto ha usado el nombre del archivo. Solo asegúrate de que sea único porque no quieres que tu foo_h confíe en el foo_h de otra persona.

Por lo general, miro a qué hora es y solo lo agrego hasta el final, es decir FOO_H_248, es una precaución adicional, y nunca tendrás que recordarlo de todos modos, por lo que no debes preocuparte por el hecho de que es críptico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top