определенные константы, действующие странно в визуальной студии

Я использую 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};

Это дает мне около тридцати разных ошибок. Я почти уверен, что только первые несколько являются относительными, а остальные потому, что эти строки кода не работали правильно ..

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'

Если я правильно понимаю определенные константы, препроцессор просто меняет их на значения перед выполнением компиляции, поэтому это очень запутанно.

0

Решение

Удалить точку с запятой:

#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_;
};
5

Другие решения

Синтаксическая проблема — лишние точки с запятой, должны быть

#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH  400

Но не делай этого.

Макросы злые. Вы рискуете непреднамеренной, нежелательной подстановкой текста. Ну, у вас уже было это, но хуже.

Вместо этого определите константы, например так:

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

#define подход к 1970-м годам C, он несколько устарел (и рискован, и на первый взгляд) с 2013 года.

2

Это потому что ты не объявил переменные скорее macros, Таким образом, он синтаксически заменяет символы тем, что вы сказали. И ты включил ; в ваших символах, поэтому синтаксис неверен. Заменить:

#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH  400

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

А именно, когда препроцессор видит символ, который вы определили в своем коде, он заменяет символ именно тем, что вы сказали (как если бы вы сделали replace операция вручную в вашем файле). И это происходит еще до того, как компилятор увидит код. Таким образом, когда вы используете макросы, вы можете иметь загадочные сообщения, так как компилятор видит другой код, чем тот, который у вас есть перед вами.

С другой стороны, макросы могут быть очень полезны, чтобы избежать стандартного кода. Но вы действительно должны знать, что вы делаете. И здесь, вы обязательно должны использовать const переменные, так как нет необходимости в синтаксическом сахаре.

1
По вопросам рекламы [email protected]