Чужая библиотека #определить конфликт именования

StackOverflow https://stackoverflow.com/questions/1080635

  •  22-08-2019
  •  | 
  •  

Вопрос

Трудно придумать подходящее название для этой проблемы.В любом случае...

В настоящее время я работаю над Графический интерфейс пользователя для моих игр в 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 является ли Только заголовок, который ведет себя так плохо.Другие заголовки обычно стараются добавлять к своим макросам префикс с некоторым именем, специфичным для библиотеки, чтобы избежать коллизий имен, они стараются избегать создания макросов для общих имен и стараются не использовать больше макросов, чем необходимо.

Другие советы

Это досадный побочный эффект #includeing <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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top