0

Visual Studio 2012 Professional を使用して、最初の Windows/DirectX プログラムを作成しています。私のプログラムの一番上に、私はこれを持っています:

3: #define SCREEN_HEIGHT 500;
4: #define SCREEN_WIDTH  400;

定数を使用することを決定する前は、これは完全に正常に機能していました。

49: //set size but not coordinates. we'll do that when we create the window
50: RECT clientArea = {0, 0, 500, 400};
51: //x-coordinates, y-coordinates, height, width
52: 
53: //Makes the previous struct have the values for the client area not the window
54: AdjustWindowRect(&clientArea, WS_OVERLAPPEDWINDOW, FALSE);
55: //address of previously defined RECT, window style, do we have a menu?
56: 
57: //create the window and store the handle
58: windowHandle = CreateWindowEx(NULL,
59:                              "WindowClass1",                        //name of window class
60:                              "My First Windowed Program",           //title of window
61:                              WS_OVERLAPPEDWINDOW,                   //window style
62:                              400,                                   //x-position
63:                              200,                                   //y-position
64:                              clientArea.right - clientArea.left,    //width
65:                              clientArea.bottom - clientArea.top,    //height
66:                              NULL,                                  //No parent
67:                              NULL,                                  //We dont have any menu's
68:                              whichInstance,                         //instance handle
69:                              NULL);                                 //we only have one window
70: 
71: //display the window
72: ShowWindow(windowHandle, howToShowTheWindow);
73: //struct with window information, defined by windows in WinMain.

しかし、この行を変更すると:

50: RECT clientArea = {0, 0, SCREEN_HEIGHT, SCREEN_WIDTH};

約30種類のエラーが発生します。最初の数行だけが関連していると確信しており、残りはそれらのコード行が正しく機能しなかったためです..

1>c:\users\kenneth\documents\visual studio 2012\projects\my first directx program\my first directx program\my first dirextx program.cpp(50): error C2143: syntax error : missing '}' before ';'
1>c:\users\kenneth\documents\visual studio 2012\projects\my first directx program\my first directx program\my first dirextx program.cpp(50): error C2143: syntax error : missing ';' before ','
1>c:\users\kenneth\documents\visual studio 2012\projects\my first directx program\my first directx program\my first dirextx program.cpp(54): error C2065: 'clientArea' : undeclared identifier
1>c:\users\kenneth\documents\visual studio 2012\projects\my first directx program\my first directx program\my first dirextx program.cpp(54): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\kenneth\documents\visual studio 2012\projects\my first directx program\my first directx program\my first dirextx program.cpp(54): error C2365: 'AdjustWindowRect' : redefinition; previous definition was 'function'

定義された定数を正しく理解していれば、プリプロセッサはコンパイルが完了する前に値を交換するだけなので、非常に混乱します。

4

3 に答える 3

5

セミコロンを削除します。

#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH  400

マクロを「コピー アンド ペースト」アクションと考えてください。500;などをコピーして貼り付けていましたRECT clientArea = {0, 0, 500;, 400;};

また、なぜ画面サイズを固定にするのですか?これにより、将来コードを変更することがはるかに難しくなります。クラスを宣言し、コンストラクターで画面サイズを指定します。

class BasicWindow
{
    BasicWindow(std::size_t width, std::size_t height)
    : WndWidth_(width), WndHeight_(height){};
private:
    std::size_t WndWidth_;
    std::size_t WndHeight_;
};
于 2013-03-31T21:33:48.947 に答える
2

構文上の問題は余分なセミコロンです。

#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH  400

しかし、そうしないでください

マクロは悪です。不注意で望ましくないテキスト置換のリスクがあります。まあ、あなたはすでにそれを持っていましたが、さらに悪いことに。

代わりに、次のように定数を定義します。

int const screen_height = 500;
int const screen_width  = 400;

この#defineアプローチは 1970 年代の C 用であり、2013 年の時点では少し古くなっています (そしてリスクがあり、目障りです)。

于 2013-03-31T21:36:21.620 に答える
1

これは、変数を宣言したのではなく、macros. したがって、構文的に記号をあなたが言ったことに置き換えます。また、シンボルに含ま;れているため、構文が正しくありません。と置換する:

#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH  400

これは、マクロの使用を避ける必要がある理由の例です。const変数にはそのような副作用がないため、変数を優先します。マクロはコンパイラに送信される前に実際にコードを変更しますが、構文の変更は発生しません。

つまり、プリプロセッサがコードで定義したシンボルを検出すると、そのシンボルを正確に指定したものに置き換えます (あたかもreplaceファイルで手動で操作を行ったかのように)。そして、これはコンパイラがコードを見る前に起こります。したがって、マクロを使用すると、目の前にあるコードとは別のコードをコンパイラが認識するため、不可解なメッセージが表示される可能性があります。

一方、定型コードを回避するには、マクロが非常に役立ちます。しかし、あなたは本当に自分が何をしているのかを知らなければなりません。ここではconst、シンタックス シュガーは必要ないため、必ず変数を使用する必要があります。

于 2013-03-31T21:35:37.853 に答える