Gibt es eine saubere Art und Weise windows.h von der Erstellung eines in der Nähe von & far Makro zu verhindern?

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

  •  02-07-2019
  •  | 
  •  

Frage

Tief unten in windef.h gibt es dieses Relikt aus der segmentierten Speicher Ära:

#define far
#define near

Das ist offensichtlich verursacht Probleme, wenn Sie versuchen, nah oder fern als Variablennamen zu verwenden. Irgendwelche sauber Abhilfen? Andere dann meine Variablen umbenennen?

War es hilfreich?

Lösung

Sie können sicher undefine sie, im Gegensatz zu Forderungen von anderen. Der Grund dafür ist, dass sie nur Makros die sind. Sie betreffen nur den Präprozessor zwischen ihrer Definition und ihrer undefinition. In Ihrem Fall wird die von früh windows.h bis zur letzten Zeile von windows.h sein. Wenn Sie zusätzliche Fenster-Header benötigen, sollten Sie sie nach windows.h und vor dem #undef umfassen. In Ihrem Code, lassen Sie die Prä-Prozessor einfach die Symbole unverändert, wie beabsichtigt.

Der Kommentar über älteren Code ist irrelevant. Dieser Code wird unabhängig in einer separaten Bibliothek, kompiliert werden. Nur zur Verknüpfungszeit werden diese angeschlossen werden, wenn Makros lange verschwunden ist.

Andere Tipps

Undefine alle Makros Sie wollen nicht nach einschließlich windows.h:

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

vielleicht:

#undef near
#undef far

könnte allerdings gefährlich sein ...

Sie wahrscheinlich nicht definiert nicht in der Nähe wollen und weit überall. Aber wenn Sie die Variablennamen verwenden müssen, können Sie mit dem folgenden das Makro lokal undefine und fügen Sie es zurück, wenn Sie fertig sind.

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

Am besten nicht. Sie sind für die Abwärtskompatibilität mit älteren Code definiert -., Wenn Sie von ihnen losgeworden irgendwie und dann später benötigt einige dieser alten Code zu verwenden, würden Sie gebrochen sein

Man könnte argumentieren, dass „in der Nähe“ und „weit“ sind nicht sehr aussagekräftig Variablennamen. Haben Sie einfach ein zusätzliches Detail Bereitstellung in Ihre Variablennamen betrachtet den Konflikt (das heißt nearest_match, furthest_match) zu lösen. Nur so ein Gedanke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top