Existe-t-il un moyen propre d’empêcher Windows.h de créer un fichier de type "near" loin macro?

StackOverflow https://stackoverflow.com/questions/118774

  •  02-07-2019
  •  | 
  •  

Question

Au fond de WinDef.h, vous trouverez cette relique de l’ère de la mémoire segmentée:

#define far
#define near

Cela pose évidemment des problèmes si vous essayez d'utiliser des noms de variables proches ou éloignés. Des solutions de rechange propres? Autre puis renommer mes variables?

Était-ce utile?

La solution

Vous pouvez les définir en toute sécurité, contrairement aux demandes des autres. La raison en est qu'ils ne sont que des macros. Ils n'affectent le préprocesseur qu'entre leur définition et leur non définition. Dans votre cas, cela va du début de windows.h à la dernière ligne de windows.h. Si vous avez besoin d'en-têtes Windows supplémentaires, vous les incluez après windows.h et avant le #undef. Dans votre code, le préprocesseur laissera simplement les symboles inchangés, comme prévu.

Le commentaire sur le code plus ancien est sans importance. Ce code sera dans une bibliothèque séparée, compilée indépendamment. C’est seulement au moment de la liaison que ces dernières seront connectées, alors que les macros ont disparu depuis longtemps.

Autres conseils

Indiquez les macros que vous ne voulez pas après avoir inclus windows.h :

#include <windows.h>
#undef near
#undef far

peut-être:

#undef near
#undef far

pourrait être dangereux si ...

Vous ne voulez probablement pas être indéfini de près ou de loin partout. Toutefois, lorsque vous devez utiliser les noms de variables, vous pouvez utiliser ce qui suit pour annuler la définition de la macro localement et la rajouter lorsque vous avez terminé.

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")

Mieux vaut ne pas le faire. Ils sont définis pour leur compatibilité ascendante avec les anciens codes - si vous les supprimiez d’une manière ou d’une autre et que vous deviez utiliser ultérieurement un peu de ces anciens codes, vous seriez cassé.

On pourrait dire que " near " et " far " ne sont pas des noms de variables très descriptifs. Avez-vous envisagé de simplement fournir des détails supplémentaires dans le nom de votre variable pour résoudre le conflit (c'est-à-dire, le plus proche, furthest_match). Juste une pensée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top