Есть ли чистый способ запретить windows.h создавать ближний и дальний макрос?
Вопрос
Глубоко внутри 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")
Лучше этого не делать.Они определены для обратной совместимости со старым кодом - если вы каким-то образом избавились от них, а затем позже вам понадобилось использовать что-то из этого старого кода, вы были бы сломаны.
Кто-то может возразить, что "ближний" и "дальний" - не очень описательные имена переменных.Рассматривали ли вы возможность простого указания дополнительной информации в имени вашей переменной для разрешения конфликта (т. е.ближайшее соответствие, самое дальнее соответствие).Просто мысль.