2009-07-03 6 views
5

Трудно найти подходящее название для этой проблемы. Во всяком случае ...Библиотека другого #define Именование конфликта

Я сейчас работаю над GUI для своих игр в SDL. Я закончил рисование программного обеспечения и был на моем пути, чтобы начать с его части OpenGL, когда возникла странная ошибка. Я включил заголовок «SDL/SDL_opengl.h» и скомпилировал. Он выбрасывает «ошибку C2039:« DrawTextW »: не является членом« GameLib :: FontHandler », что является достаточно простой ошибкой, но у меня нет ничего, называемого DrawTextW, только FontHandler :: DrawText. Я ищу DrawTextW и нахожу его в вызове #define в заголовке «WinUser.h»!

//WinUser.h 
#define DrawText DrawTextW 

Видимо он заменяет мой DrawText с DrawTextW! Как я могу помешать ему перекинуться на мой код?

Это незначительная вещь, которая меняет имя моей собственной функции, но конфликты имен, подобные этому, выглядят довольно опасными, и я действительно хотел бы знать, как избежать их всех вместе.

Cheers!

ответ

9

У вас есть несколько вариантов, каждый из которых сосут.

  • Добавить #undef DrawText в своем собственном коде
  • Не включайте windows.h. Если другая библиотека включает в себя это для вас, не включайте это напрямую. Вместо этого включите его в отдельный .cpp-файл, который затем может выставить ваши собственные функции-обертки в своем заголовке.
  • Переименуйте собственное DrawText.

Если возможно, я обычно выбираю средний вариант. windows.h ведет себя плохо разными способами (например, на самом деле он не компилируется, если вы не включите проприетарные расширения C++ Microsoft), поэтому я просто избегаю его, как чумы. Если я могу помочь, он не будет включен в мои файлы. Вместо этого я пишу отдельный .cpp-файл, чтобы его содержать, и раскрывать нужные мне функции.

Также не стесняйтесь представить его как ошибку и/или отзыв на сайте connect.microsoft.com. Windows.h - это криминально плохо спроектированный заголовок, и если люди обращают на него внимание Microsoft, есть (тонкий) шанс, что однажды он сможет его исправить.

Хорошей новостью является то, что windows.h является только заголовок, который ведет себя так плохо.Другие заголовки обычно пытаются префикс своих макросов с определенным именем библиотеки, чтобы избежать конфликтов имен, они стараются избегать создания макросов для общих имен, и они стараются избегать использования большего количества макросов, чем это необходимо.

+0

Да, Windows.h действительно сталкивается. Я предполагаю, что справедливо жаловаться на то, что он не компилирует без расширений ms/MSS, но также разумно, что заголовок, специфичный для ms, должен (требует этих расширений). – bobobobo

5

Это неудачный побочный эффект #include ing <windows.h>. Предполагая, что вы на самом деле не используете Windows, DrawText() где-нибудь в вашей программе, это совершенно безопасно #undef сразу после того, как:

// wherever you #include <windows.h>, or any other windows header 
#include <windows.h> 
#undef DrawText 
+0

Спасибо! Теперь он компилируется. Довольно раздражающий побочный эффект. Кажется, что SDL_opengl.h включает windows.h, но #undef выполняет свою работу. Может ли windows.h быть написано по-другому, чтобы избежать этой проблемы? – Zoomulator

+1

Это может быть. Но это потребует от Microsoft ухода. – jalf

+1

@jalf Вы должны рассматривать вещи в контексте. Этот API старше 30 лет, чего вы ожидаете от Microsoft? Разрыв совместимости? Просмотрите блог Раймонда Чена когда-нибудь, и вы начнете понимать, почему программирование для Windows так болезненно иногда и почему многие вещи не могут быть просто исправлены. – minexew

4

Там нет вообще способа избежать этой проблемы - когда вы #include заголовочного файла с помощью препроцессор может переопределить любое имя, которое ему нравится, и вы ничего не можете с этим поделать. Вы можете #undef имя, но это предполагает, что вы знаете, что имя было #defined в первую очередь.

0

Только #undef символы, которые вы не хотите. Но убедитесь, что вы включили windows.h и сделать это, прежде чем включать SDL:

#include <windows.h> 
#undef DrawText 

#include <SDL/SDL_opengl.h> 
Смежные вопросы