Есть ли чистый способ помешать windows.h создавать ближний и дальний макрос? - PullRequest
11 голосов
/ 23 сентября 2008

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

#define far
#define near

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

Ответы [ 6 ]

21 голосов
/ 23 сентября 2008

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

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

8 голосов
/ 23 сентября 2008

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

#include <windows.h>
#undef near
#undef far
3 голосов
/ 23 сентября 2008

может быть:

#undef near
#undef far

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

1 голос
/ 23 сентября 2008

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

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")
0 голосов
/ 23 сентября 2008

Можно утверждать, что «ближний» и «дальний» не очень описательные имена переменных. Рассматривали ли вы просто дополнительную информацию в имени переменной для разрешения конфликта (то есть, near_match, furthest_match). Просто мысль.

0 голосов
/ 23 сентября 2008

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

...