Question

Comment sont C ++ comprennent gardes généralement nommé? J'ai tendance à voir ce lot:

#ifndef FOO_H
#define FOO_H

// ...

#endif

Cependant, je ne pense pas que ce soit très intuitif. Sans voir le nom du fichier, il est difficile de dire ce que FOO_H est là et ce que son nom fait référence.

Qu'est-ce qui est considéré comme la meilleure pratique?

Était-ce utile?

La solution

De ma propre expérience, la convention est de nommer les gardes d'inclusion après le fichier d'en-tête les contenant à l'exception que le nom est tout en majuscules et la période est remplacé par un trait de soulignement.

test.h devient TEST_H.

Des exemples réels de ce comprennent Qt Creator, qui suit cette convention lorsque les fichiers d'en-tête de la classe de génération automatique.

Autres conseils

Je suivre personnellement la recommandation Boost. Il est peut-être l'une des plus grande collection de bibliothèques C de bonne qualité autour et ils n'ont pas problème.

Il va comme:

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

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

qui est:

  • juridique (note commençant par _[A-Z] que ou contenant __ est pas)
  • facile à générer
  • garantie à être unique (en comprennent la garde) dans un projet (sinon vous avez deux fichiers au même endroit)
  • garantie de ne pas utiliser quoi que ce soit d'autre (si vous finissez avec une autre macro INCLUDED vous abîmez pour un combat)

Je l'ai lu sur GUID mais ceux regard bizarre.

Et évidemment, je préfère que tous les compilateurs mettre en œuvre #pragma once (ou mieux, #pragma multiple et « une fois » être le comportement par défaut ...)

Google Guide de style :

Tous les fichiers d'en-tête doivent avoir #define gardes pour empêcher l'inclusion multiple. Le format du nom du symbole doit être _ _ _H_. À unicité de garantie, ils devraient être basé sur le chemin complet dans un projet de de arbre source. Par exemple, le fichier foo / src / bar / baz.h dans le projet foo devrait avoir la garde suivante:

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

J'utilise ce style dans mes propres projets.

Regardez le code #include de votre tête.

Si elle est quelque chose comme:

#include "mylib/myheader.h"

mylib/myheader.h est déjà un nom unique. Il suffit de capitaliser et remplacer / et. avec _

#define MYLIB_MYHEADER_H

Si vous avez deux têtes sur votre chemin d'inclusion du même nom par rapport au chemin d'inclusion, vous avez déjà une collision à ce niveau.

Remplacer FOO_H avec FOO_H_INCLUDED et il est plus clair.

Comme d'autres mentionné précédemment, une convention très courante consiste à utiliser la version majuscule du nom, et le point remplacé par un trait de soulignement: foo.h -> FOO_H

Cependant, cela peut conduire à des collisions avec un nom simple et / ou des noms communs. Pour cette raison, en-tête autogénérés comme le stdafx.h dans non vides projets Visual C ++ C append une chaîne aléatoire, comme:

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS
#define FOO_H__NsknZfLkajnTFBpHIhKS
#endif

http://www.random.org/strings/ est un générateur aléatoire utile pour cette .

En outre, si le fichier fait partie de certains sous-module, ou de son contenu réside dans un espace de noms spécifique, je tends à ajouter que la garde aussi:

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS

namespace somecomponent
{
  ...
}

#endif

J'utilise normalement quelque chose comme FOO_H_INCLUDED_. Quelques têtes (Microsoft) ont ce qui ressemble beaucoup à une représentation de chaîne d'un GUID, mais je n'ai jamais besoin de quelque chose que tout à fait complexe.

Habituellement, les gens le font par nom de fichier afin que le code de chaque fichier ne sera compilé et ajouté une fois. Vous pourriez faire FOO_H ce que vous voulez, mais presque tout ce que j'ai jamais vu ou codé a utilisé le nom de fichier. Assurez-vous qu'il est unique parce que vous ne voulez pas que votre FOO_H en conflit avec la FOO_H de quelqu'un d'autre.

je regarde souvent quelle heure il est et juste append que jusqu'à la fin de celui-ci, à savoir FOO_H_248, il y a une précaution supplémentaire, et vous ne jamais avoir à se rappeler de toute façon, de sorte que vous n'avez pas besoin de vous soucier du fait que c'est cryptique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top