web-dev-qa-db-fra.com

Comment inclure le fichier stdafx.h à partir du répertoire racine?

Avec l'option "Afficher tous les fichiers" dans VS, j'ai ajouté un dossier et créé une nouvelle classe dans ce dossier. Depuis que j'utilise des en-têtes précompilés, je dois également inclure le fichier stdafx.h qui se trouve dans le répertoire racine par rapport au nouveau fichier de classe.

Dans mon fichier cpp j'ai

#include "..\stdafx.h"

Pourtant, j'ai l'erreur suivante:

error C1010 : fin inattendue du fichier lors de la recherche d'un en-tête précompilé. Avez-vous oublié d'ajouter '#include "stdafx.h"' à votre source?

D'après ce que je comprends, le .. devrait demander au compilateur de monter d'un niveau de répertoire vers le haut?

20
Dante

Visual C++ vous permet de définir plusieurs manières de configurer des fichiers d'en-tête précompilés. La plus courante consiste à l'activer pour TOUS les fichiers source au niveau de la configuration du projet. Sous Propriétés de configuration/C++/En-têtes précompilés, définissez "En-tête précompilé", sélectionnez "Utiliser". Le même emplacement, définissant "Fichier d'en-tête précompilé", est généralement "stdafx.h". Tous les fichiers auront ce paramètre (donc la configuration du projet) SAUF ....

Un fichier est responsable de la génération du fichier PCH. Ce fichier est généralement le fichier stdafx.cpp de votre projet et ne contient généralement rien d'autre que #include "stdafx.h". Configuration des en-têtes précompilés pour That One File, passez de "Utiliser" à "Créer". Cela garantit que si l'en-tête principal de PCH n'est plus synchronisé, stdafx.cpp est TOUJOURS compilé en premier pour régénérer le fichier de données PCH. Il existe d'autres moyens de configurer le paramètre PCH dans Visual Studio, mais c'est la plus courante.

Cela étant dit, votre problème est définitivement irritant. Le nom de fichier utilisé pour amorcer le système PCH et spécifié à la fois dans les paramètres "Utiliser ..." et "Créer ..." au-dessus de DOIT CORRIGER LE TEXTE DANS VOTRE #include EXACTEMENT .

Par conséquent, il est fort probable que vous puissiez résoudre votre problème en ajoutant ".." à votre projet, les répertoires d'inclusion et en supprimant le ".." de votre instruction #include. vous pouvez également le modifier au niveau de la configuration du projet pour qu'il devienne "..\stdafx.h" comme en-tête complet, mais cela peut poser un problème si vous avez des fichiers source hiérarchiquement dans plusieurs dossiers.

Oh, et si vous ne compreniez pas bien les paramètres de configuration de PCH, si vous ne souhaitez PAS utiliser PCH pour un fichier source spécifique (et qu'il existe des raisons de ne pas le faire parfois), vous pouvez le désactiver pour des fichiers source spécifiques, sinon, assurez-vous de toujours avoir #include "your-pch-include-file.h" en tête de chaque fichier source (c/cpp, etc.).

J'espère que vous prenez une pause.

16
WhozCraig

Il est intéressant de noter que le truc que j'utilise n'est pas dans les réponses:

  1. Créez stdafx.h et stdafx.cpp dans le dossier racine du projet.
  2. Accédez aux propriétés du projet -> en-têtes précompilés. Changer pour "utiliser".
  3. Accédez au fichier stdafx.cpp, cliquez avec le bouton droit de la souris sur propriétés -> en-têtes précompilés. Changer pour "créer".
  4. Accédez aux propriétés du projet -> avancé; remplacez "Forcer les fichiers d'inclusion" par stdafx.h;% (ForcedIncludeFiles)

Ne changez aucun fichier RPC; conservez vos fichiers d'en-tête tels quels. Construire tel quel.

Pas de dactylographie, pas de RSI, pas de soucis avec des chemins d'accès, pas d'autre douleur et de misère. Et la beauté est que cela fonctionnera toujours lorsque vous déplacerez votre solution sur une autre plate-forme. Impressionnant.

10
atlaste

Généralement, j'aime aussi avoir un ordre hiérarchique dans mes projets et j'ai découvert qu'il existe deux façons simples d'inclure un en-tête précompilé:

Non plus

  1. Mettez le répertoire où stdafx.h se trouve dans les répertoires include du compilateur.

    ( Propriétés - Répertoires VC++ - Inclure les répertoires : Ajouter $(ProjectDir))

Ou

  1. S'il n'y a pas trop de sous-répertoires, voici un moyen simple de contourner le message d'erreur:

    • Placez un fichier stdafx.h dans chacun de vos sous-répertoires contenant uniquement le stdafx.h de niveau supérieur:
      #include "..\stdafx.h"
    • Écrivez #include "stdafx.h" comme première ligne de tous les fichiers source de vos sous-répertoires, au lieu d’y inclure le fichier de niveau supérieur.

De cette manière, tous vos fichiers de code utilisent le même fichier d’en-tête précompilé, et il n’ya pas d’autre configuration compliquée à faire.

8
Felix Dombek

Vous pouvez ajuster les paramètres d'en-tête précompilés par fichier.

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier .cpp, sélectionnez "Propriétés".
  2. Je vous recommande fortement de sélectionner "Toutes les configurations" dans la liste déroulante Configuration.
  3. Accédez à "C/C++" - "En-têtes précompilés".
  4. Ajustez le "Fichier d'en-tête précompilé" de "stdafx.h" à tout ce dont vous avez besoin (dans votre cas, par exemple "../stdafx.h").

Notez que cela est fastidieux et source d’erreurs car cela est effectué fichier par fichier, et les futurs développeurs qui ajouteront des fichiers à votre projet devront suivre les mêmes étapes. Sinon, ils seront confrontés à des avertissements et des erreurs telles que:

  • warning C4627: '#include "<path>"': skipped when looking for precompiled header use.

et

  • fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

qui ne donnent pas beaucoup d'indications sur cette approche ou sur une autre.

Je suppose qu'ils finiront par se tourner vers StackOverflow et se retrouveront ici ... Bonjour, merci d'avoir lu.

Sur cette base, cela vaut la peine de rechercher des alternatives, telles que de mettre $(ProjectDir) sur le chemin d’inclusion C++ (sous C++\General), mais cela peut créer de la confusion lorsque vous incluez d’autres fichiers d’en-tête.

3
WaffleSouffle

Les fichiers PCH sont bizarres et plus encore dans Visual Studio. Lors de la compilation d'un fichier .cpp utilisant un fichier PCH, VS s'attend à ce que le premier texte ne contenant pas de commentaire/espace soit de #include "PCH_NAME_HERE". Le PCH_NAME_HERE est exactement le nom du PCH. Pas de répertoires, rien. Juste le nom de PCH tel que spécifié dans les options du compilateur.

Si vous allez faire ce fudging de répertoire, vous devez alors modifier les paramètres de votre compilateur afin que le répertoire dans lequel se trouve PCH se trouve dans le chemin de recherche. De cette façon, vous n'avez pas besoin de la partie ..\.

2
Nicol Bolas

Je suggérerais d'utiliser:

$(ProjectDir)/pch/my_pch.h

as "Fichier d'en-tête précompilé"
et "Avancé> Forcer l'inclusion de fichier"

Ceci inclura automatiquement pch pour vos fichiers .cpp au début, donc rien ne doit être modifié dans les fichiers .cpp.

Et cela vaut mieux que de changer le répertoire include, car vous pouvez parfois avoir plusieurs fichiers pch dans les répertoires include et vous ne pouvez pas savoir quel fichier a été utilisé.

0
Jason

La confusion est due au fait que Visual Studio traite la directive include qui inclut l’en-tête précompilé différemment des autres directives include. Spécifiquement, il ne recherche pas l'en-tête précompilé en utilisant l'approche de recherche de chemin normale, mais tente simplement de faire correspondre la directive include à celle définie dans la configuration du projet par simple comparaison de chaîne.

La configuration de l'en-tête du précompilateur est définie globalement mais peut être remplacée par fichier. La configuration globale normale (accessible via Propriétés du projet -> Propriétés de configuration -> C/C++ -> En-têtes précompilés) est la suivante:

Precompiled Header: Use (/Yu)
Precompiled Header File: stdafx.h
Precompiled Header Output File: $(IntDir)$(TargetName).pch

Cette configuration est appliquée à tous les fichiers du projet par défaut. Cependant, la configuration de stdafx.cpp est définie au niveau du fichier et remplace la valeur de l'en-tête précompilé par:

Precompiled Header: Create (/Yuc)

Cela a pour effet que, quel que soit le fichier source configuré pour utiliser l'en-tête précompilé (par défaut, ils sont tous excepté stdafx.cpp), VS recherchera une directive include correspondant à la valeur configurée du fichier d'en-tête précompilé. par exemple.

#include "stdafx.h"

Comme la vérification utilise une simple comparaison de chaînes au lieu de tout type de recherche de répertoire, alors (quel que soit l'emplacement du fichier source par rapport au répertoire racine du projet ou l'emplacement du fichier stdafx.h), le chemin et le nom du fichier utilisé dans l'include directive doit correspondre à exactement à celle utilisée par le paramètre de configuration Fichier d'en-tête précompilé du projet. Cela a pour effet inattendu que, si vous avez un sous-répertoire de projet contenant plusieurs fichiers source, vous n'avez pas besoin de référencer le fichier stdafx.h en utilisant un chemin relatif tel que ..\stdafx.h (et si vous le faites générera une erreur indiquant qu’il a rencontré la fin du fichier lors de la recherche de l’en-tête précompilé).

Utilisez simplement le #include "stdafx.h" sans fioritures et tout fonctionnera correctement, car VS le reconnaîtra alors comme directive d’utilisation de l’en-tête précompilé et il sait déjà où se trouve le bon en-tête précompilé en raison de la configuration de l’en-tête précompilé stdafx.cpp. défini sur "Créer (/ Yc)".

0
Neutrino