Есть ли в Visual Studio опция макроподстановки, чувствительная к пространству имен? - PullRequest
1 голос
/ 29 июля 2011

Я говорю о том, чтобы найти способ избежать макросов в <windows.h> от загрязнения любого проекта, который я пишу.

Выдержки из windows.h:

#ifdef UNICODE
#define LoadImage  LoadImageW
#else
#define LoadImage  LoadImageA
#endif // !UNICODE

#ifdef UNICODE
#define GetMessage  GetMessageW
#else
#define GetMessage  GetMessageA
#endif // !UNICODE

С большинством макросов (более 99%) у меня все в порядке, но с некоторыми из них я просто не мог найти способ избежать.

Моя идея заключается в том, что, поскольку я всегда квалифицирую вызовы функций в моей конкретной среде, например, ImageTool::LoadImage, Visual Studio должен иметь достаточно подсказок, чтобы я не ссылался на API Windows, которые все находятся в корневом пространстве имен, т.е. ::LoadImage. Но система MACRO, похоже, не настолько умна.

Есть ли опция компилятора или препроцессора, которая просто включит это?

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

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

Простой способ избежать замены ваших идентификаторов - удалить макросы:

#ifdef LoadImage
#undef LoadImage
#endif

Это, конечно, также не позволит следующему коду получить доступ к Windows API с именем LoadImage.

1 голос
/ 29 июля 2011

Вы будете жить с этим - вы не можете избежать этих макросов на платформе Windows. В мире препроцессоров C / C ++ нет пространства имен макросов. Тем не менее, вы можете иметь весь свой код, определенный и реализованный до включения любого заголовка Windows, - но я думаю, что это будет невозможно.

...