2016-12-29 1 views
1

J'ai un projet VS2015 C++. L'application doit fonctionner à la fois sur Windows 7 et XP. Donc, je veux définir _WIN32_WINNT & WINVER à _WIN32_WINNT_WINXP.'_WIN32_WINNT'/'WINVER': redéfinition de la macro

Voici comment stdafx.h de mon projet ressemble à:

stdafx.h

#pragma once 

#include "targetver.h" 

#define _WIN32_WINNT  _WIN32_WINNT_WINXP   
#define WINVER    _WIN32_WINNT_WINXP 

#include <WinSDKVer.h> 

// Windows Header Files: 
#include <windows.h> 

Lors de la compilation, je vois l'avertissement/erreur suivant:

stdafx.h(12): error C2220: warning treated as error - no 'object' file generated 
1>stdafx.h(12): warning C4005: '_WIN32_WINNT': macro redefinition 
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\SDKDDKVer.h(197): note: see previous definition of '_WIN32_WINNT' 
1>stdafx.h(13): warning C4005: 'WINVER': macro redefinition 
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\SDKDDKVer.h(212): note: see previous definition of 'WINVER' 
+0

vous pas besoin de '#define _WIN32_WINNT directe » - supprimer simplement ce – RbMm

+0

ou ajoutez cette ligne '#define _CHICAGO_' – RbMm

+1

Jetez un oeil à targetver.h, suivez les instructions. –

Répondre

2

Parce que la #include "targetver.h" inclut <sdkddkver.h> qui définit déjà les constantes _WIN32_WINNT et WINVER quand ils ne sont pas déjà définis par l'environnement de construction.

En fait, l'auto-généré targetver.h vous dit exactement comment résoudre ce problème:

#pragma once 

// Including SDKDDKVer.h defines the highest available Windows platform. 

// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and 
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. 

#include <SDKDDKVer.h> 

solution simple. Définissez simplement ces constantes avant l'inclusion de targetver.h. Vous pourriez avoir à utiliser la valeur littérale réelle pour XP puisque vous avez pas inclure le fichier d'en-tête qui définit

Comme ceci:

// x501 is XP 
#define _WIN32_WINNT  0x0501   
#define WINVER    0x0501 

#include "targetver.h" 
#include <windows.h> 
+2

Existe-t-il une solution utilisant des noms comme _WIN32_WINNT_WINXP au lieu de constantes numériques comme 0x0501? – Liviu

+0

@Liviu - tout ce dont vous avez besoin est dans '' – selbie

+2

oui, mais je dois définir '_WIN32_WINNT' avant d'inclure' ', n'est-ce pas? Et accepter l'avertissement 'C4005: '_WIN32_WINNT': redéfinition de la macro' – Liviu