Есть ли чистый способ запретить windows.h создавать ближний и дальний макрос?

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

  •  02-07-2019
  •  | 
  •  

Вопрос

Глубоко внутри WinDef.h хранится реликвия эпохи сегментированной памяти:

#define far
#define near

Это, очевидно, вызывает проблемы, если вы пытаетесь использовать near или far в качестве имен переменных.Есть какие-нибудь чистые обходные пути?Кроме переименования моих переменных?

Это было полезно?

Решение

Вы можете смело не определять их, вопреки утверждениям других.Причина в том, что это всего лишь макросы.Они влияют на препроцессор только между их определением и неопределением.В вашем случае это будет от начала в windows.h до последней строки в windows.h.Если вам нужны дополнительные заголовки Windows, вы бы включили их после windows.h и перед #undef .В вашем коде препроцессор просто оставит символы неизменными, как и предполагалось.

Комментарий о более старом коде неуместен.Этот код будет находиться в отдельной библиотеке, скомпилированной независимо.Они будут подключены только во время соединения, когда макросов уже давно не будет.

Другие советы

Отмените определение любых макросов, которые вам не нужны, после включения windows.h:

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

может быть:

#undef near
#undef far

хотя это может быть опасно...

Вероятно, вы не хотите везде указывать "близко" и "далеко".Но когда вам нужно использовать имена переменных, вы можете использовать следующее, чтобы отменить определение макроса локально и добавить его обратно, когда закончите.

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

Лучше этого не делать.Они определены для обратной совместимости со старым кодом - если вы каким-то образом избавились от них, а затем позже вам понадобилось использовать что-то из этого старого кода, вы были бы сломаны.

Кто-то может возразить, что "ближний" и "дальний" - не очень описательные имена переменных.Рассматривали ли вы возможность простого указания дополнительной информации в имени вашей переменной для разрешения конфликта (т. е.ближайшее соответствие, самое дальнее соответствие).Просто мысль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top