Quelles sont les règles sur #include “xxx.h” vs #include ?

Si j’ai mes propres projets de bibliothèque, quel style dois-je utiliser pour #include inclure leurs en-têtes dans ma candidature? Existe-t-il des règles ssortingctes et les deux significations sont-elles différentes du compilateur / préprocesseur ou s’agit-il uniquement de normes?

Il existe peu de règles, selon la norme ISO. Les deux formes dépendent de l’implémentation pour savoir où elles cherchent les fichiers d’en-tête. Ils n’ont même pas besoin d’ être des fichiers.

La section 2.9 de C ++ 11 ne fait pas de distinction entre les deux variétés, à part le fait que vous pouvez inclure " dans la variante <> et > dans la variante "" mais peu de personnes seraient assez idiotes pour utiliser ces caractères dans les noms de fichiers: – )

La section 16.2 stipule en outre:


Une directive de prétraitement de la forme # include < h-char-sequence> new-line recherche dans une séquence d’emplacements définis par l’implémentation un en-tête identifié uniquement par la séquence spécifiée entre les délimiteurs < et > et provoque le remplacement de cette directive par l'intégralité du contenu de l'en-tête. La manière dont les espaces sont spécifiés ou l'en-tête identifié est définie par l'implémentation.

Une directive de prétraitement de la forme # include " q-char-sequence" new-line provoque le remplacement de cette directive par l'intégralité du contenu du fichier source identifié par la séquence spécifiée entre les " délimiteurs. Le fichier source nommé est recherché dans Si cette recherche n’est pas prise en charge ou si elle échoue, la directive est traitée à nouveau comme si elle lisait # include < h-char-sequence> new-line avec une séquence identique contenue (y compris> caractères, si any) de la directive d'origine.


J'ai tendance à utiliser <> pour les en-têtes système et "" pour mes propres en-têtes, mais ce n'est qu'une préférence personnelle. Je voudrais noter que le document C ++ 11 susmentionné dit:

Remarque: Bien qu'une implémentation puisse fournir un mécanisme permettant de rendre des fichiers source arbitraires disponibles pour la recherche <> , les programmeurs devraient en général utiliser le formulaire <> pour les en-têtes fournis avec l'implémentation et le formulaire "" pour les sources indépendantes de la volonté de l'implémentation. .

Ce n'est pas obligatoire mais c'est quand même une bonne idée.

Habituellement, vous utilisez des guillemets pour signifier que les fichiers d’en-tête sont situés dans des positions relatives par rapport au répertoire de votre projet. Par contre, si vous utilisez des crochets angulars, le compilateur s’attend à ce que l’emplacement des fichiers d’en-tête soit standard . Tels que /usr/include , /usr/local/include ou tout autre emplacement par défaut pour votre compilateur.

Dans GCC, si vous utilisez le drapeau -I , les inclusions avec crochet seront également recherchées aux emplacements spécifiés.

Exemple:

 $ gcc -Wall -I/path/to/my/library/include myfile.c 

Donc, si vous avez myfile.h dans /path/to/my/library/include , vous pouvez utiliser #include dans le source myfile.c .

Cela affecte l’endroit où le préprocesseur recherche le fichier d’inclusion. De MSDN:

“Formulaire cité: Ce formulaire demande au préprocesseur de rechercher les fichiers d’inclusion dans le même répertoire que le fichier contenant l’instruction #include, puis dans les répertoires des fichiers contenant ce fichier (#include). Le préprocesseur recherche ensuite le chemin spécifié par l’option / I du compilateur, puis le long des chemins spécifiés par la variable d’environnement INCLUDE.

Forme de crochet: Ce formulaire demande au préprocesseur de rechercher les fichiers d’inclusion en commençant par le chemin spécifié par l’option du compilateur / I, puis par la ligne de commande lors de la compilation, par le chemin spécifié par la variable d’environnement INCLUDE. ”

À titre indicatif, je n’utilise des guillemets que lorsque j’essaie de spécifier un chemin relatif au répertoire contenant le fichier contenant le #include. Sinon, je viens d’utiliser des équerres. À titre d’exemple de mon projet actuel:

 #include  // standard library headers #include  #include  #include  // third-party library headers #include  #include  // specified relative to my own base include dir #include "PartitionForest.h" // a header in the current directory 

Après avoir utilisé des dizaines de compilateurs sur plusieurs systèmes d’exploitation différents, je vous conseille d’utiliser uniquement pour les en-têtes spécifiques au système et à l’exploitation, et "yh" pour tout le rest, y compris vos bibliothèques et les en-têtes de projet.

Ensuite, vous configurez les chemins de recherche d’inclusion appropriés à l’aide de l’option -I (ou autre) de votre compilateur. Ceci est plus facile si vous utilisez quelque chose comme make ou ant pour faire vos builds.

Pour les en-têtes de logiciels tiers, vous pouvez utiliser l’une ou l’autre forme. Si le paquet est installé et accessible à tous les utilisateurs (par exemple, dans un /usr/local/bin tel que /usr/local/bin ou /usr/site/bin ), le formulaire est probablement plus correct. S’il est installé dans votre arborescence de génération locale, le formulaire "yh" est plus correct, car il est contrôlé dans votre processus de génération.

Cette combinaison est la plus portable.