Esiste un modo pulito per impedire a windows.h di creare un & amp; macro lontana?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Nel profondo di WinDef.h c'è questa reliquia dell'era della memoria segmentata:

#define far
#define near

Ciò ovviamente causa problemi se si tenta di utilizzare nomi vicini o lontani come variabili. Qualche soluzione alternativa pulita? Oltre a rinominare le mie variabili?

È stato utile?

Soluzione

Puoi tranquillamente definirli, contrariamente a quanto affermato da altri. Il motivo è che sono solo macro. Influiscono solo sul preprocessore tra la loro definizione e la loro indefinizione. Nel tuo caso, ciò avverrà dall'inizio di windows.h fino all'ultima riga di windows.h. Se hai bisogno di ulteriori intestazioni di Windows, le includeresti dopo windows.h e prima di #undef. Nel tuo codice, il preprocessore lascerà semplicemente invariati i simboli, come previsto.

Il commento sul codice precedente è irrilevante. Tale codice sarà in una libreria separata, compilata in modo indipendente. Solo al momento del collegamento saranno collegati, quando le macro sono sparite da tempo.

Altri suggerimenti

Annulla la definizione delle macro che non desideri dopo aver incluso windows.h :

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

forse:

#undef near
#undef far

potrebbe essere pericoloso però ...

Probabilmente non vorrai definire indefinitamente vicino e lontano dappertutto. Ma quando è necessario utilizzare i nomi delle variabili, è possibile utilizzare quanto segue per annullare la definizione locale della macro e aggiungerla nuovamente al termine.

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

Meglio non farlo. Sono definiti per la compatibilità all'indietro con il codice precedente: se in qualche modo ti sbarazzassi di loro e in seguito dovessi usare un po 'di quel vecchio codice, saresti rotto.

Si potrebbe sostenere che "vicino a" e "lontano" non sono nomi di variabili molto descrittivi. Hai preso semplicemente in considerazione la possibilità di fornire ulteriori dettagli nel nome della tua variabile per risolvere il conflitto (vale a dire, la più vicina, la più lontana). Solo un pensiero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top