2008-09-23 7 views
10

Глубоко в WinDef.h есть эта реликвия из сегментированной эпохи памяти:Есть ли чистый способ предотвратить windows.h от создания макроса close and far?

#define far 
#define near 

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

ответ

19

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

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

+1

+1 для исправления безумия большинства других ответов. –

+1

Я согласен с комментарием о том, что старый код не имеет значения, но я не согласен с аргументом. Отдельные библиотеки включают заголовочные файлы, которые могут использовать 'near' и' far'. –

3

может быть:

#undef near 
#undef far 

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

+3

Безопаснее в исходном файле, чем заголовок ... –

0

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

7

Undefine любые макросы вы не хотите после включения windows.h:

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

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

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

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