web-dev-qa-db-fra.com

Avertissement C4005 VS2012 C++: '__useHeader': redéfinition des macros

Lors de la migration d'un ancien projet C++ de Visual Studio 6 vers Visual Studio 2012, nous avons rencontré un ensemble étrange d'avertissements provenant des en-têtes standard de la plate-forme Microsoft:

  • avertissement C4005: '__useHeader': redéfinition des macros
  • avertissement C4005: '__on_failure': redéfinition des macros

Une recherche en ligne n'a trouvé que quelques personnes rencontrant cette erreur. Dans certains cas, c’était des personnes qui essayaient d’utiliser VS2012 pour compiler du code DirectX hérité - ce que je ne suis pas en train de faire. Dans d'autres cas, il s'agissait de personnes essayant d'utiliser VS2012 pour cibler Windows XP (à l'aide de la nouvelle option de la mise à jour 1), ce que je suis en train de faire.

Il a été répondu à la question DirectX que l'avertissement sera toujours là pour vous dire que vous compilez avec une version obsolète (antérieure à Win8) de DirectX et vous devrez simplement vivre avec.

La question Windows XP n'a pas reçu de réponse. D'autres personnes ont simplement dit qu'elles ne pourraient pas reproduire le problème.

Je l'ai reproduite et j'ai trouvé la cause, que je suis en train d'écrire ici, pour aider tous ceux qui rencontrent cela.

28
Jeff B

Accédez aux propriétés du projet et recherchez le champ "Définitions du préprocesseur".

En plus des constantes de définition par défaut et ajoutées, vous devriez voir une macro:

%(PreprocessorDefinitions)

Cette macro apporte apparemment certaines définitions de préprocesseur supplémentaires fournies par le compilateur. Je ne sais pas quelle version de Visual Studio a introduit cette macro, mais il n'était pas là dans Visual Studio 6.

Dans Visual Studio 2012, cette macro est requise être présente dans le champ Définitions du préprocesseur de votre projet. Cela peut également être requis dans les versions précédentes de Visual Studio, mais je ne les ai pas testées.

Si cette macro est manquante, vous verrez les messages d'erreur comme indiqué ci-dessus.

19
Jeff B

METTRE À JOUR:

Voir Edmund 's réponse à cette même question premier - essayez-le. Si cela fonctionne, tant mieux! Sinon, essayez ce qui suit:

ORIGINAL:

Utilisez la solution de contournement mentionnée dans l'onglet "Contournements" de cette page Web:

http://connect.Microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012windows-xp-v110-xp

À savoir, ajoutez:

#define _USING_V110_SDK71_ 1

... directement dans le fichier .rc before, cela inclut tout ce qui pourrait inclure les en-têtes système à l'origine de cet avertissement.

11
DLRdave

Nous n'avons pas trouvé de solution à ce sujet publié en ligne, alors voici ce qui a fonctionné pour moi.

Je construis un projet avec 110_xp outils

Je reçois ces avertissements ...

c:\program files (x86)\Microsoft sdks\windows\v7.1a\include\sal_supp.h(57): warning C4005: '__useHeader' : macro redefinition
          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2872) : see previous definition of '__useHeader'
c:\program files (x86)\Microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77): warning C4005: '__on_failure' : macro redefinition
          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2882) : see previous definition of '__on_failure'

Clairement une incohérence entre les en-têtes VC 11 et les en-têtes 7.1a sdk.

Dans mon stdafx.cpp je l'ai fait ...

#define _USING_V110_SDK71_

#include "stdafx.h"

... le problème de construction est parti.

11
softwarebear

Ceci est un avertissement du compilateur de ressources. La solution est facile. Cliquez avec le bouton droit sur le fichier .rc dans l'explorateur de solutions et choisissez Propriétés. Maintenant, allez dans Ressources> Général> Définitions du préprocesseur, et ajoutez

%(PreprocessorDefinitions)
6
Edmund

Pour moi, une autre solution a fonctionné.

Dans projet Propriétés Propriétés de configuration C/C++ Général , j'ai modifié le champ Ajout de répertoires d'inclusion chemin d'accès au SDK avec cette macro:

$(WindowsSDK_IncludePath)

Avant cela, ce champ contenait le chemin de mon SDK v7.1 et j'avais les mêmes avertissements.

4
Dorin

Ajouter #define _USING_V110_SDK71_ dans Stdafx.cpp ou Stdafx.h ne fonctionnerait pas si vos fichiers cpp n’ont pas d’en-têtes précompilés.

Pour résoudre ce problème, ce qui suit fonctionne.

Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions * → Propriétés C/C++ Préprocesseur Définition du préprocesseur éditer → Ajouter _USING_V110_SDK71_

3
Tae-Sung Shin

C'est encore plus simple. 

Il suffit de cocher la case "Hériter des valeurs par défaut du parent ou du projet" dans Propriétés de configuration C/C++ Définitions de préprocesseur/préprocesseur Modifier .

2
Pekka

Pour moi, cela s'est passé avec Visual Studio 2017 (installation récente ou réparée). De toute évidence, le SDK Windows 7.1 avait été installé avant VS2017 et avait été intégré à une installation de Visual Studio 2005.

Dans mon cas, les deux fichiers:

  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props

contient des références aux répertoires d’inclusion et aux bibliothèques du SDK Windows 7.1. Enlever ces références a fait le travail.

N'oubliez pas que chaque projet C++ pour Win32 et x64 hérite respectivement de ces feuilles de propriétés.

1
0xC0000022L

J'ai rencontré ce problème dans certains projets issus de VC++ 2003 et qui ont été progressivement mis à niveau au fil des ans. J'ai constaté que, si les paramètres du projet contenaient %(PreprocessorDefinitions) dans les définitions de préprocesseur, quelques-uns des fichiers .cpp n'en avaient pas (les plus anciens). Après les avoir modifiés en "Hériter des valeurs par défaut du parent ou du projet", les avertissements ont été supprimés.

0
Reed Hedges

Bien que cette réponse concerne VS10, elle présente un intérêt, car elle pourrait fournir des indices sur ce qui se passe, à savoir les macros des répertoires VC++: L'avertissement est apparu lorsque ces instructions ont été ajoutées dans le fichier d'en-tête d'un projet, MyApp:

#ifndef NTDDI_WINXPSP3
#define NTDDI_WINXPSP3 0x05010300
#endif 
#ifndef NTDDI_Vista
#define NTDDI_Vista 0x06000000
#endif 
#ifndef NTDDI_VISTASP1
#define NTDDI_VISTASP1 0x06000100
#endif 
#ifndef NTDDI_WS08
#define NTDDI_WS08 0x06000100
#endif 

Des avertissements comme ceux-ci apparaissent pour tous sauf le déf. XPSP3:

Avertissement RC4005: 'NTDDI_VISTASP1': redéfinition C:\Program Files (x86)\SDK Microsoft\Windows\v7.0A\include\sdkddkver.h .., MyApp

MyApp était une version WinDebug 32, notant que Windows7.1SDK était apparu dans la section X64 du fichier proj: 

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>

La valeur héritée pour les définitions de préprocesseur était _VC80_UPGRADE = 0x0600. Après avoir utilisé le jeu d'outils SDK avant de revenir à V100, les bibliothèques du SDK ont été trouvées sous la forme inherited_from dans répertoires d'inclusion et répertoires de bibliothèque dans répertoires VC++ section, comme noté ici .
On dirait que l'avertissement est généré à la suite d'une combinaison de modifications de mise à niveau, de migration ou d'outils.

Edit: un problème non lié à VS2017 (MBCS) choisit d'utiliser 

LoadCursorW(nullptr, IDC_ARROW)

LoadCursorA(...) par défaut dans une structure WNDCLASSEXW. Une solution possible est de redéfinir comme suit:

 #define IDC_ARROW           MAKEINTRESOURCEW(32512)

Ici, l'avertissement peut être supprimé en utilisant la procédure #undef avant le #define:

#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW           MAKEINTRESOURCEW(32512)
0
Laurie Stearn