定义的常量在视觉工作室中表现得很奇怪

时间:2013-03-31 21:32:35

标签: c++ windows visual-studio-2012 visual-c++-2012

我正在使用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'

如果我正确理解了定义的常量,那么预处理器只需在完成任何编译之前将它们换成它们的值,所以这非常令人困惑。

3 个答案:

答案 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变量,因为不需要语法糖。