2

私は非常にシンプルなプラットフォームを独立した(少なくともそれが計画です)コンソールアプリにしています。それを実現するために、conio.hからpdCursesに変更しました。それに関する問題は、WindowsでCodeblocksとgccを使用すると問題が発生することです。

含めると、大量のエラーが発生します。それらはすべて、内部の異なるソースファイルにある3つのマクロに関係しています。

CodeBlocks \ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 ........ \ include \ c ++ \ 3.4.5 \ bits \

このようにこれらの3つのマクロの定義を解除すると、次のようになります。

#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のリンクの何が問題になっているのかをどのように確認できますか?

-レフテリス

4

2 に答える 2

1

マクロの問題については、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を使用すると、すべてのマクロの定義がスキップされます。私が見た限りでは、それらはすべて標準画面の便利なマクロであるため、実際には機能が失われることはありませんが、画面変数を明示的に必要とする関数を使用する必要があります。または、名前の衝突がない独自のマクロを使用すると思います。

于 2009-07-16T18:05:23.980 に答える
0

A.問題が発生する理由はわかりませんが(PDCursesを使用するMSVCでは発生しません)、「適切な方法」は、正しいディレクティブを持つ独自のヘッダーを実装し、代わりにそれを含めることです。

B.私にはリンクエラーのように見えますが、対応するコードを表示してみませんか?

于 2009-07-16T17:55:45.683 に答える