Windows API переполнен макросами с чистыми именами, которые расширяются до имен функций с суффиксом, обозначающим ASCII / UTF-16, в зависимости от параметров сборки. Было бы неплохо, если бы они начинали все с префикса "W32" или аналогичного (а-ля "NS" в OS X), но предпочли не поддерживать API "чистым".
Поскольку ваш код изменить намного проще, чем его API, вот несколько советов:
1) Изучите Windows API (на самом деле он не такой уж большой!) Или, по крайней мере, познакомьтесь с MSDN , чтобы вы могли искать конфликты имен при встрече с необъяснимым потоком программ.
2) Используйте явное разрешение области видимости в своем коде (MyClass :: GetClassName ()). К сожалению, это нарушит диспетчеризацию виртуальных функций, поэтому будьте осторожны с этим.
3) Используйте другое соглашение об именах в вашем коде. MS всегда использует CamelCase, поэтому вы не будете конфликтовать, если выберете другое соглашение (get_class_name (), getClassName () и т. Д.).
4) Лично я ненавижу называть мои геттеры и сеттеры «GetX ()» и «SetX ()», но предпочитаю использовать механизм перегрузки и использовать «xtype X () const» для геттеров и «void X ( xtype newval) "для сеттеров. Ваш пробег может отличаться, но я считаю, что он чище, и получение / установка очевидна из аргументов. Очевидно, вы должны быть осторожны, если используете аргументы по умолчанию.
Удачи!