2013-01-16 10 views
25

Durante la migrazione di un vecchio progetto C++ da Visual Studio 6 fino a Visual Studio 2012, ci siamo imbattuti in un set dispari di avvertimenti da dentro la piattaforma Microsoft intestazioni standard:VS2012 C++ C4005 avviso: '__useHeader': macro ridefinizione

  • avvertimento C4005: '__useHeader': macro ridefinizione
  • avvertimento C4005: '__on_failure': macro ridefinizione

una ricerca online trovato solo poche altre persone in esecuzione in questo errore. In alcuni casi, era gente che cercava di usare VS2012 per compilare il codice DirectX legacy, cosa che non sto facendo. In altri casi, erano le persone che tentavano di utilizzare VS2012 per scegliere come target Windows XP (utilizzando la nuova opzione dell'aggiornamento 1), cosa che sto facendo.

Alla domanda DirectX è stato risposto che l'avviso sarà sempre lì per dirti che stai compilando una versione obsoleta (pre-Win8) di DirectX, e devi solo conviverci .

La domanda di Windows XP non ha avuto risposta. Altre persone hanno semplicemente detto che non potevano riprodurre il problema.

L'ho riprodotto e ho trovato la causa, che sto scrivendo qui per aiutare chiunque altro incontri questo.

risposta

17

Andare nelle proprietà del progetto e trovare il campo "Definizioni di preprocessore".

Oltre alla definizione delle costanti aggiunto di default e, si dovrebbe vedere una macro:

%(PreprocessorDefinitions) 

Questa macro porta a quanto pare in alcune definizioni del preprocessore compilatore fornito ulteriori. Non sono sicuro di quale versione di Visual Studio ha introdotto questa macro, ma non c'era in Visual Studio 6.

In Visual Studio 2012, questa macro è richiesto di essere presente in campo Definizioni preprocessore del progetto. Potrebbe anche essere richiesto nelle versioni precedenti di Visual Studio, ma non li ho testati.

Se questa macro non è presente, verranno visualizzati i messaggi di errore come mostrato sopra.

+7

Questa macro viene aggiunta alla migrazione da VS2005 a VS2012 per impostazione predefinita e non è stata utile nel mio caso. Una volta, ho cambiato la directory include SDK da v7.1A a '$ (WindowsSDK_IncludePath)' che è la versione 8.0 tutti gli avvisi sono andati. – alex555

+2

Ho% (PreprocessorDefinitions) e ricevo comunque gli avvisi.La soluzione con $ (WindowsSDK_IncludePath) ha funzionato per me. –

+2

Ciò può verificarsi anche quando i singoli file di origine hanno definizioni di preprocessore che sovrascrivono le definizioni del progetto. –

9

Non ho trovato una soluzione a questo pubblicato ovunque online, quindi ecco cosa ha funzionato per me.

Sto costruendo un progetto con strumenti 110_xp

ottengo questi avvertimenti ...

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' 

Chiaramente un'incoerenza tra i VC 11 intestazioni e le intestazioni 7.1a SDK.

Nel mio stdafx.cpp ho fatto questo ...

#define _USING_V110_SDK71_ 

#include "stdafx.h" 

... il problema di build è andato via.

+1

Ho ricevuto avvertimenti simili come popup all'apertura delle risorse nell'editor delle risorse e questo suggerimento ha funzionato alla grande per rimuoverli. –

+0

Anch'io, ma ho dovuto usare ... #if _USING_V110_SDK71_ == 1/#define _USING_V110_SDK71_ 1/#endif // ... per evitare lo stesso avvertimento durante la compilazione di stdafx.cpp. Sembra che abbiano messo automaticamente un/D "_USING_V110_SDK71_" nelle righe di comando del compilatore e del compilatore di risorse quando il set di strumenti della piattaforma è impostato su v110_xp. Molto strano che questa correzione influenzi il caricamento delle risorse nella vista risorse di Visual Studio. Ma non fraintendermi, sono contento che lo faccia. Grazie! – DLRdave

+0

Lo riprendo ..... questa correzione non ha funzionato per me in modo permanente. Ho ancora l'errore di farlo in questo modo. Ho dovuto utilizzare la soluzione qui menzionata: http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110 -xp per eliminare completamente l'avviso. – DLRdave

5

Questo è un avviso del compilatore di risorse. La soluzione è facile. Fare clic con il tasto destro sul file .rc in solution explorer e selezionare Proprietà.Ora vai a Risorse> Generali> definizioni del preprocessore, e aggiungere

%(PreprocessorDefinitions) 
+1

Errore C4005 è un errore del compilatore, ma alcune persone stanno ricevendo _RC_ 4005 dal compilatore di risorse, nel qual caso questa è la loro soluzione. Per qualche motivo i ** singoli file .rc ** perdono le impostazioni ereditate. –

7

UPDATE:

See s' Edmundanswer to this same question prima - dare che una prova. Se funziona, bene! In caso contrario ... provare quanto segue:

ORIGINALE:

Utilizzare la soluzione indicata sulla scheda "Soluzioni alternative" di questa pagina web:

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

Vale a dire, aggiungere:

#define _USING_V110_SDK71_ 1 

... direttamente nel file .rc prima dello include tutto ciò che include l'intestazione del sistema s che causa questo avvertimento.

+0

Vorrei averlo visto qualche tempo fa. – Blazes

+1

No, non farlo. Vedi la risposta di Edmund - assicurandosi che i singoli file .rc ereditino correttamente le impostazioni del progetto. –

+0

Grazie per il commento - ho upvoted e collegato alla risposta di Edmund. (Anche se, mi sto fidando che funzioni senza verificare personalmente. Da allora siamo passati a VS 2013, e i singoli file .rc mostrano gli errori ereditati bene in VS 2013 ...) – DLRdave

2

È ancora più semplice.

Basta controllare la casella di controllo "Eredita dal genitore o di progetto di default" in Proprietà di configurazioneC/C++preprocessore/Definizioni preprocessoreModifica.

3

L'aggiunta di #define _USING_V110_SDK71_ in Stdafx.cpp o Stdafx.h non funzionerebbe se i file cpp non hanno intestazioni precompilate.

Per risolvere questo problema, i seguenti lavori.

progetto pulsante destro del mouse in Esplora soluzioni * → ProprietàC/C++preprocessoredefinizione del preprocessoreModifica → Aggiungi _USING_V110_SDK71_

3

Per me un'altra soluzione ha funzionato.

Nel progetto Proprietàproprietà di configurazioneC/C++Generale, ho cambiato l'aggiunta campo includere le directory percorso SDK con questa macro:

$(WindowsSDK_IncludePath) 

Prima di allora , questo campo aveva il percorso per il mio SDK v7.1 e avevo gli stessi avvertimenti.

0

Ho riscontrato questo problema in alcuni progetti originati con VC++ 2003 e sono stati aggiornati in modo incrementale nel corso degli anni. Ho scoperto che mentre le impostazioni del progetto avevano %(PreprocessorDefinitions) in Definizioni di preprocessore, alcuni dei file .cpp non ce n'erano (quelli più vecchi). Dopo averli modificati in "Eredita da impostazioni padre o progetto", ha eliminato gli avvisi.

+0

Ho finito per modificare il progetto file direttamente e rimuovendo tutti gli elementi xml per le proprietà specifiche dei file all'interno dell'elemento '' del file .cpp. –

0

Anche se questa risposta è per VS10, è di interesse in quanto potrebbe fornire alcuni indizi utili a capire che cosa sta succedendo e cioè la Directory di VC++ macro: L'avvertimento è comparso quando sono state aggiunte queste dichiarazioni nel file di intestazione di un progetto, MiaApp:

#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 

Avvertenze simile al seguente spuntato per tutti, ma la XPSP3 Def .:

Attenzione RC4005: 'NTDDI_VISTASP1': ridefinizione C: \ Program Files (x86) \ Microsoft SDK \ Windows \ V7. 0A \ include \ sdkddkver.h .., MyApp

MyApp era un WINDEBUG 32 accumulo, notando Windows7.1SDK apparso nella sezione X64 del file proj:

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

Il valore ereditato per Definizioni preprocessore era _VC80_UPGRADE = 0x0600. Dopo aver usato il set di strumenti SDK prima di ritornare al V100, le librerie SDK sono stati trovati come inherited_from in Includere directory e Biblioteca directory nella sezioneDirectory di VC++, come notato here.
Sembra che l'avviso sia generato come risultato di una combinazione di modifiche di aggiornamento, migrazione o set di strumenti.

Edit: un problema non correlato in VS2017 (MBCS) sta optando per utilizzare

LoadCursorW(nullptr, IDC_ARROW) 

al posto del default LoadCursorA(...) in una struttura WNDCLASSEXW. Una possibile soluzione è quella di ridefinire in questo modo:

#define IDC_ARROW   MAKEINTRESOURCEW(32512) 

Qui l'allarme può essere soppresso con il #undef procedure prima della #define:

#ifdef IDC_ARROW 
#undef IDC_ARROW 
#endif 
#define IDC_ARROW   MAKEINTRESOURCEW(32512) 
1

Per me questo è accaduto con Visual Studio 2017 (sia fresco che installazione riparata). Ovviamente l'SDK di Windows 7.1 era stato installato prima di VS2017 ed era stato integrato in un'installazione di Visual Studio 2005.

Nel mio caso i due file:

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

contenevano riferimenti alle directory di include e le librerie del SDK 7.1 di Windows. Rimozione di questi riferimenti ha fatto il lavoro.

Tenere presente che ogni singolo progetto C++ per Win32 e x64 eredita rispettivamente da questi fogli di proprietà.