2318 votes

Quelle est la différence entre #include <filename> et #include "nom de fichier"?

Dans le C et le C++ langages de programmation, quelle est la différence entre l'utilisation de crochets et à l'aide de citations dans un include déclaration, comme suit?

  1. #include <filename>
  2. #include "filename"

1382voto

quest49 Points 4863

La différence est dans le lieu où le préprocesseur recherche le fichier inclus.

Pour #include "filename" le préprocesseur recherches dans le même répertoire que le fichier contenant la directive. Cette méthode est habituellement utilisée pour inclure programmeur-défini fichiers d'en-tête.

Pour #include <filename> le préprocesseur recherches dans une mise en œuvre dépendante, normalement dans les répertoires pré-désigné par le compilateur. Cette méthode est habituellement utilisée pour inclure la bibliothèque standard fichiers d'en-tête.

707voto

piCookie Points 3048

La seule façon de savoir est de lire votre mise en œuvre de la documentation.

Dans la norme C, de l'article 6.10.2, paragraphes 2 à 4 de l'état:

  • Un prétraitement de la directive de la forme

    #include <h-char-sequence> new-line
    

    recherche d'une séquence de mise en œuvre définies par endroits pour un en-tête identifié de manière unique par la séquence spécifiée entre l' < et > délimiteurs, et entraîne le remplacement de cette directive par la totalité du contenu de l'en-tête. Comment les lieux sont précisés ou l'en-tête identifié la mise en œuvre est définie.

  • Un prétraitement de la directive de la forme

    #include "q-char-sequence" new-line
    

    provoque le remplacement de cette directive par la totalité du contenu de la source de fichier identifié par la séquence spécifiée entre l' " des délimiteurs. Le nom du fichier source est recherché pour la mise en œuvre définis. Si cette recherche n'est pas pris en charge, ou si la recherche échoue, la directive est retraité comme si elle lisait

    #include <h-char-sequence> new-line
    

    avec la même séquence contenue (y compris > caractères, le cas échéant) de l'original la directive.

  • Un prétraitement de la directive de la forme

    #include pp-tokens new-line
    

    (qui ne correspond pas à l'une des deux formes précédentes) est autorisée. Le prétraitement des jetons include dans la directive sont traités comme du texte normal. (Chaque identificateur est actuellement défini comme un nom de macro est remplacée par la liste de remplacement de prétraitement des jetons.) La directive résultant après tout remplacement doit correspondre à l'une des deux formes précédentes. La méthode par laquelle une séquence de prétraitement des jetons entre un < et > prétraitement jeton paire, ou une paire de " caractères est combiné en un seul nom d'en-tête de prétraitement jeton est mise en œuvre définies.

Définitions:

  • h-char: tout membre de la source de jeu de caractères, sauf le caractère de nouvelle ligne et >

  • q-char: tout membre de la source de jeu de caractères, sauf le caractère de nouvelle ligne et "

281voto

aib Points 18608

La séquence de caractères entre < et > uniquement référence à un en-tête, ce qui n'est pas nécessairement un fichier. Les implémentations sont à peu près libre d'utiliser la séquence de caractères comme ils le souhaitent. (Pour la plupart, cependant, juste le traiter comme un nom de fichier et faire une recherche dans le chemin, comme les autres postes de l'état.)

Si l' #include "file" formulaire est utilisé, la mise en œuvre de la première recherche un fichier du nom donné, si la prise en charge. Si non (pris en charge), ou si la recherche échoue, l'application se comporte comme si l'autre (#include <file>) a été utilisée.

Aussi, une troisième forme existe et est utilisée lorsque l' #include directive ne correspond pas à l'une des formes ci-dessus. Dans ce formulaire, la base de prétraitement (tels que la macro-expansion) est réalisée sur la "opérandes" de la #include directive, et le résultat devrait correspondre à l'une des deux autres formes.

112voto

ydroneaud Points 1960

Quelques bonnes réponses ici faire référence à la norme, mais vous avez oublié la norme POSIX, en particulier le comportement spécifique de l' c99 (par exemple, le compilateur C) de commande.

Selon Le Groupe de Base des Spécifications de la Question 7,

-J'ai répertoire

Modifier l'algorithme de la recherche pour les en-têtes dont les noms ne sont pas des chemins absolus de regarder dans le répertoire nommé par le répertoire de chemin avant de le regarder dans les endroits habituels. Ainsi, les en-têtes dont les noms sont entre guillemets doubles ( "" ) doit être recherché d'abord dans le répertoire du fichier avec l' #include ligne, puis dans les répertoires nommés dans -je options, et la dernière dans les endroits habituels. Pour les en-têtes dont les noms sont indiqués entre chevrons ( "<>" ), l'en-tête doit être recherché que dans des répertoires nommés dans -je options, puis dans les endroits habituels. Les répertoires nommés en -I options doivent être recherchés dans l'ordre spécifié. Les implémentations doivent prendre en charge au moins dix instances de cette option dans un seul c99 invocation de commande.

Donc, en un compatible POSIX environnement, conformes à POSIX compilateur C, #include "file.h" est susceptible d'aller à la recherche d' ./file.h tout d'abord, où . est le répertoire où se trouve le fichier avec l' #include déclaration, tandis que d' #include <file.h>, est susceptible d'aller à la recherche d' /usr/include/file.h première, où /usr/include votre système est défini lieux habituels pour les en-têtes (il ne semble pas définie par POSIX).

44voto

Quandary Points 12867

Il n':

"mypath/myfile" is short for ./mypath/myfile

avec . soit le répertoire du fichier où le #include figure, et/ou le répertoire de travail courant du compilateur, et/ou la defaultincludepaths
et

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile



Si ./ est dans <defaultincludepaths>, alors il ne fait pas de différence.
Si mypath/myfile est dans un autre répertoire, le comportement est indéfini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X