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), };
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), };
如果数组是常量,那么你可以简单地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。没有指定何时相对于其他翻译单元中的全局变量对其进行初始化,因此如果另一个全局变量的构造函数尝试访问它,您的程序可能具有未定义的行为。一般来说,全局变量充满危险,所以使用它们时要格外小心。
您不应在头文件中定义变量,因为它将在包含头文件的站点上多次定义。您应该改用访问器方法:
头文件
#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;
}