pdCurses используется в Windows, портит 3 макроса gcc
Вопрос
Я делаю очень простое консольное приложение, независимое от платформы (по крайней мере, это план).Чтобы это произошло, я сменил conio.h на pdCurses.Проблема в том, что в Windows при использовании Codeblocks и gcc у меня возникает проблема.
Когда я включаю, я получаю массу ошибок.Все они относятся к трем макросам, расположенным в разных исходных файлах внутри:
CodeBlocks\MinGW\bin..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\
Если я отменю определение этих трех макросов следующим образом:
#include <curses.h>
#undef move
#undef erase
#undef clear
тогда все компилируется хорошо.Если я не отменю определение, я получу массу ошибок об этих макросах.
Примеры ошибок:
macro "move" passed 3 arguments, but takes just 2|
\bits\char_traits.h|185|error: invalid function declaration|
\bits\basic_string.h|604|error: expected `)' before '->' token|
\bits\basic_string.h|1039|macro "erase" passed 2 arguments, but takes just 0|
Кто-нибудь знает, почему это происходит?А есть какой-нибудь не такой уж и безобразный способ исправить проблему?Спасибо заранее за ваш вклад.
Редактировать:Я также получаю неопределенные ссылки на различные вещи всякий раз, когда вызываю какие-либо функции pdcurses.Я не могу понять, почему.Я определенно правильно связал библиотеку.Например, пытаясь отобразить символ на экране, я получаю:
main.cpp|74|undefined reference to `__imp__SP'|
main.cpp|74|undefined reference to `__imp__stdscr'|
main.cpp|74|undefined reference to `__imp__stdscr'|
Может ли это быть что-то кроме плохой компоновки библиотеки?И как посмотреть что не так с привязкой pdcurses из вышеописанных ошибок?
-Лефтерис
Решение
Чтобы решить проблему с макросом, выполните поиск «STL» в файле Curs.h, и вы должны найти:
#ifdef __cplusplus
#ifndef NCURSES_NOMACROS
/* these names conflict with STL */
#undef box
#undef clear
#undef erase
#undef move
#undef refresh
#endif /* NCURSES_NOMACROS */
Возможно, вы сможете найти обходной путь с этим.
РЕДАКТИРОВАТЬ:В моей копии, если вы #define NCURSES_NOMACROS, определение всех макросов будет пропущено.Насколько я понимаю, все они представляют собой просто удобные макросы для стандартного экрана, поэтому вы действительно не теряете никакой функциональности, но вам придется использовать функции, которые явно требуют переменную экрана.Или, я полагаю, используйте свои собственные макросы, у которых нет конфликтов имен.
Другие советы
А.Я не знаю, почему возникла проблема (это не происходит в MSVC с PDCurses), но «правильный способ» — реализовать собственный заголовок с правильными директивами и включить его вместо этого.
Б.Мне кажется, это ошибка связывания, но почему бы вам не показать соответствующий код?