РЕДАКТИРОВАТЬ: Я нашел похожий вопрос, и ответы в основном таковы, что windows.h плохой, и вы должны либо переименовать свои функции, либо #undef макросы: Библиотека других файлов # конфликт определения имен
Тем не менее, я считаю, что мой по-прежнему отличается из-за противоречивого поведения LoadLibrary при сборках отладки и выпуска.
Я программирую на Windows с использованием Visual Studio, и у меня возникли некоторые специфические проблемы с директивами препроцессора, используемыми в windows.h, и с заголовками, которые он включает.
Наш проект имел функцию в своем собственном пространстве имен, MyProject::FileManager::CreateFile()
. После включения windows.h наш код не смог скомпилироваться из-за ошибки компоновщика, заявившего, что он не может разрешить MyProject :: FileManager :: CreateFileW (обратите внимание на W в конце имени функции). Это была не статическая функция, это была функция-член объекта FileManager
, который вызывался с помощью file_manager.CreateFile(...)
.
При выделении функции в Visual Studio всплывающая подсказка отображала следующее:
#define CreateFile CreateFileW
Мы были озадачены, но просто переименовали функцию в качестве обходного пути. Однако позже мы столкнулись с похожей проблемой с функцией LoadLibrary
, которую мы пытались использовать из Windows API. Компиляция в режиме отладки, LoadLibrary
была определена как LoadLibraryW()
, которая приняла LPCWSTR (широкая строка) в качестве параметра. Когда я пытался построить в режиме Release, эта функция была теперь определена как LoadLibraryA()
, которая принимает обычный LPCSTR. Это сломало нашу сборку, потому что код был написан в предположении, что LoadLibrary
принял LPCWSTR.
Итак, мой вопрос: как программист должен иметь с этим дело? Должен ли я просто обернуть свои вызовы в LoadLibrary с помощью проверки # ifdef для режима отладки или выпуска? Или есть более простое решение?
Кроме того, я нашел интересный заголовочный файл на github, который, кажется, был создан с единственной целью # undef'ing всех этих имен функций:
https://github.com/waTeim/poco/blob/master/include/Poco/UnWindows.h