2011-10-03 5 views
15

He estado haciendo archivos como este por un tiempo: ¿Tiene sentido el orden? o deberían intercambiarse el espacio de nombres y los #includes y por qué.¿Qué viene primero? guardias de encabezado, espacio de nombres e incluye

#ifndef CLASSNAME_H // header guards 
#define CLASSNAME_H 

#include "a.h" // includes in alphabetical order 
#include "b.h" // user specified includes first 
#include "c.h" 
#include <vector> // then library includes 

namespace MyNamespace 
{ 
    class ClassName 
    { 

    }; 
} 

#endif 
+7

Imagínese que '# include' literalmente pega los contenidos del archivo en su archivo base, y luego resuelva en qué espacio de nombres desea tener qué declaraciones. –

+0

... y también considere lo que sucedería si diferentes archivos .cpp incluyen los mismos encabezados dentro de espacios de nombres diferentes ... –

Respuesta

10

Sí. Eso se ve bien.

Aunque ordeno mis encabezados de manera diferente (pero alfabéticamente está bien).

Lo único que cambiaría es el protector de inclusión. Hago el include my namspace así como también el nombre de la clase. Como muchas veces tengo clases con el mismo nombre (pero en un espacio de nombre diferente) que utiliza el mismo código.

#ifndef MY_COMPANY_MY_NAME_SPACE_MYCLASSNAME_H // header guards 
#define MY_COMPANY_MY_NAME_SPACE_MYCLASSNAME_H 

#include "a.h" // includes in order of most specific to most general. 

       // My includes first. 
       // Then C++ headers   <vector> 
       //  I group all the containers together. 
       // Then C specific headers <sys/bla.h> 
       // Then C generic headers <ctype.h> 


namespace MyNamespace 
{ 
    Class ClassName 
    { 

    }; 
} 

#endif 
+1

Cuando los nombres de los archivos de encabezado son únicos, es suficiente usar el mismo nombre para el protector de inclusión; este es el caso típico. Si estuvieras extrayendo archivos de inclusión de diferentes directorios, podrías tener dos con el mismo nombre, entonces esta técnica podría tener sentido. –

+2

El problema con esta regla es que tienes que discutir con otros desarrolladores que incluyen que son "más específicos" y que son "más generales". Por lo tanto, dado que cada inclusión debe extraer todas sus dependencias, el orden es generalmente irrelevante, y el orden alfabético es una buena opción que no causa discusión (después de dividir encabezados de proyecto y sistema, por supuesto). – Juliano

+0

Depende de lo que estés haciendo. Si está trabajando en una aplicación, simplemente 'MYFILE_H' debería estar bien, siempre y cuando se asegure de que todos los nombres de los archivos sean únicos. Si está trabajando en una biblioteca que se usará en contextos desconocidos, definitivamente querrá protegerla más: uso algo así como: 'GB_Fallible_hh_20061203izn6Lk4kky3qvxlFVfxSpKam': los últimos 24 caracteres se generan aleatoriamente (usando'/dev/random'), que significa que los conflictos son imposibles. –

4

Lo que ha escrito es perfecto. No creo que deba cambiar el orden.

Cuestiones relacionadas