0

I want to define an array of CRect objects in a header file. So will it be something similar to this:

  #pragma once
  #include<atltypes.h>

  CRect blockPos[3] = { CRect(0,0,55,43),  CRect(0,0,55,43), CRect(0,0,55,43), };
4

2 回答 2

1

如果数组是常量,那么你可以简单地const在标题中声明数组:

CRect const blockPos[3] = { CRect(0,0,55,43),  CRect(0,0,55,43), CRect(0,0,55,43), };

这确实意味着包含标头的每个翻译单元都会生成自己的副本,如果数组非常大,这可能并不理想。

如果它不是常量,或者您想避免多个副本,那么您将需要整个程序的单个定义,并且只需要在标题中声明:

// header
extern CRect blockPos[3];

// some source file
CRect blockPos[3] = { CRect(0,0,55,43),  CRect(0,0,55,43), CRect(0,0,55,43), };

在这种情况下,请注意静态初始化命令 fiasco。没有指定何时相对于其他翻译单元中的全局变量对其进行初始化,因此如果另一个全局变量的构造函数尝试访问它,您的程序可能具有未定义的行为。一般来说,全局变量充满危险,所以使用它们时要格外小心。

于 2012-09-03T14:51:50.403 回答
0

您不应在头文件中定义变量,因为它将在包含头文件的站点上多次定义。您应该改用访问器方法:

头文件

#pragma once

CRect* GetRectArray();

C++ 文件

#include "MyHeader.h"

namespace
{
    CRect blockPos[3] = { CRect(0,0,55,43),  CRect(0,0,55,43), CRect(0,0,55,43), };
}

CRect* GetRectArray()
{
    return blockPos;
}
于 2012-09-03T11:46:06.643 回答