Чужая библиотека #определить конфликт именования
Вопрос
Трудно придумать подходящее название для этой проблемы.В любом случае...
В настоящее время я работаю над Графический интерфейс пользователя для моих игр в SDL.Я закончил разработку программного обеспечения и уже собирался приступить к его части OpenGL, когда возникла странная ошибка.Я включил заголовок "SDL/SDL_opengl.h" и скомпилировал.Он выдает "ошибку C2039:'DrawTextW' (Нарисовать текст) :не является членом 'GameLib::FontHandler'", что является достаточно простой ошибкой, но у меня нет ничего, что называется DrawTextW , только FontHandler::DrawText .Я ищу DrawTextW и нахожу его в вызове #define в заголовке "WinUser.h"!
//WinUser.h
#define DrawText DrawTextW
Очевидно, это заменяет мой DrawText на DrawTextW!Как я могу предотвратить подобное перетекание в мой код?
Изменение имени моей собственной функции - это мелочь, но конфликты имен, подобные этому, кажутся довольно опасными, и я действительно хотел бы знать, как избежать их всех вместе.
Ваше здоровье!
Решение
У вас есть пара вариантов, и все они отстойные.
- Добавить
#undef DrawText
в вашем собственном коде - Не включайте
windows.h
.Если другая библиотека включает это для вас, не включайте это напрямую.Вместо этого включите его в отдельныйcpp-файл, который затем может отображать ваши собственные функции-оболочки в своем заголовке. - Переименуйте свой собственный
DrawText
.
Когда это возможно, я обычно выбираю средний вариант. windows.h
ведет себя плохо бесчисленным количеством других способов (например, на самом деле он не компилируется, если вы не включите проприетарные расширения Microsoft C ++), поэтому я просто избегаю его, как чумы.Это не включается в мои файлы, если я могу с этим поделать.Вместо этого я пишу отдельный файл .cpp, чтобы содержать его и предоставлять необходимую мне функциональность.
Кроме того, не стесняйтесь сообщать об этом как об ошибке и / или отзыве на connect.microsoft.com.Windows.h - это преступно плохо оформленный заголовок, и если люди обратят на это внимание Microsoft, есть (небольшой) шанс, что однажды они смогут это исправить.
Хорошая новость заключается в том, что windows.h
является ли Только заголовок, который ведет себя так плохо.Другие заголовки обычно стараются добавлять к своим макросам префикс с некоторым именем, специфичным для библиотеки, чтобы избежать коллизий имен, они стараются избегать создания макросов для общих имен и стараются не использовать больше макросов, чем необходимо.
Другие советы
Это досадный побочный эффект #include
ing <windows.h>
.Предполагая, что вы на самом деле не используете Windows ' DrawText()
в любом месте вашей программы совершенно безопасно #undef
это сразу после:
// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText
Общего способа избежать этой проблемы не существует - как только вы #включаете файл заголовка с помощью препроцессора, он может переопределить любое имя, которое ему нравится, и вы ничего не можете с этим поделать.Вы можете #отменить определение имени, но это предполагает, что вы знаете, что имя было #определено в первую очередь.
Просто #undef
символы, которые вам не нужны.Но убедитесь, что вы включаете windows.h
и сделайте это перед включением SDL:
#include <windows.h>
#undef DrawText
#include <SDL/SDL_opengl.h>