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

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

#define far
#define near

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


person hyperlogic    schedule 23.09.2008    source источник


Ответы (5)


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

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

person MSalters    schedule 23.09.2008
comment
+1 за исправление безумия большинства других ответов. - person R.. GitHub STOP HELPING ICE; 08.07.2010
comment
Я согласен с комментарием о том, что старый код не имеет значения, но я не согласен с аргументом. Отдельные библиотеки включают файлы заголовков, которые могут использовать near и far. - person sam hocevar; 04.03.2011

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

#include <windows.h>
#undef near
#undef far
person John Millikin    schedule 23.09.2008

может быть:

#undef near
#undef far

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

person John Boker    schedule 23.09.2008

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

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")
person Aaron Fischer    schedule 23.09.2008

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

person 1800 INFORMATION    schedule 23.09.2008
comment
32-разрядная и 64-разрядная версии Windows поддерживают только плоскую модель памяти, не сегментированную с двумя размерами указателей. Если у вас есть код, который все еще использует far char *p = ... или какой-то другой правильный синтаксис, то 1. удалите его. 2. вы уже знаете, что вам нужны эти определения для компиляции этого древнего кода, и не ищете ответа на этот вопрос. - person Peter Cordes; 30.07.2019