Windows での pdCurses の使用は 3 つの gcc マクロを混乱させます
質問
私は非常に単純なプラットフォームに依存しない(少なくともそれが計画である)コンソールアプリを作成しています。それを実現するために、conio.h から pdCurses に変更しました。問題は、Windows で Codeblock と gcc を使用すると問題が発生することです。
インクルードすると大量のエラーが発生します。これらはすべて、内部の異なるソース ファイルにある 3 つのマクロに関係します。
CodeBlocks\MinGW\bin..\lib\gcc\mingw32\3.4.5....\include\c++\3.4.5\bits\
これら 3 つのマクロを次のように undef すると、次のようになります。
#include <curses.h>
#undef move
#undef erase
#undef clear
そうすればすべて正常にコンパイルされます。undef しないと、これらのマクロに関する大量のエラーが発生します。
エラーの例は次のとおりです。
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 のリンクの何が問題になっているのかを確認するにはどうすればよいでしょうか?
-レフテリス
解決
マクロの問題については、curses.h ファイルで「STL」を検索すると、次のものが見つかるはずです。
#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 を実行すると、すべてのマクロの定義がスキップされます。私が見た限り、それらはすべて標準画面用の便利なマクロであるため、機能が失われることはありませんが、明示的に画面変数を必要とする関数を使用する必要があります。あるいは、名前の衝突がない独自のマクロを使用すると思います。
他のヒント
A.なぜ問題がそこにあるのかはわかりませんが (PDCurses を使用する MSVC では問題は発生しません)、「適切な方法」は、正しいディレクティブを持つ独自のヘッダーを実装し、代わりにそれをインクルードすることです。
B.リンクエラーのように見えますが、対応するコードを表示してみてはいかがでしょうか?