我正在使用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 :(得分: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_;
};
答案 1 :(得分:2)
语法问题是额外的分号,应该是
#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH 400
但不要那样做。
宏是邪恶的。您冒着无意的,不受欢迎的文本替换的风险。嗯,你已经有了,但更糟。
相反,定义常量,如下所示:
int const screen_height = 500;
int const screen_width = 400;
{p> #define
方法适用于1970年代的C,截至2013年,它有点过时(风险很大,而且是一个眼睛)。
答案 2 :(得分:1)
那是因为您没有声明变量而是macros
。因此,它通过你所说的语法替换符号。并且您在符号中包含;
,因此语法不正确。替换为:
#define SCREEN_HEIGHT 500
#define SCREEN_WIDTH 400
这是您应该避免使用宏的示例。更喜欢const
变量,因为它们没有任何这样的副词:它们不会引起语法上的变化,而宏实际上会在将代码发送到编译器之前对其进行修改。
即,只要预处理器看到您在代码中定义的符号,它就会用您所说的内容替换该符号(就像您在文件中手动完成replace
操作一样)。这发生在编译器甚至看到代码之前。因此,当您使用宏时,您可能会收到含糊的消息,因为编译器会看到另一个代码而不是您面前的代码。
另一方面,宏可以非常有用,以避免样板代码。但你真的必须知道你做了什么。在这里,你绝对应该使用const
变量,因为不需要语法糖。