我想在头文件中定义一个CRect
个对象的数组。那将是类似的东西:
#pragma once
#include<atltypes.h>
CRect blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
答案 0 :(得分: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), };
在这种情况下,请注意静态初始化顺序惨败。没有指定何时将相对于其他转换单元中的全局变量初始化,因此如果另一个全局变量的构造函数尝试访问它,则程序可能具有未定义的行为。一般来说,全局变量充满了危险,所以要特别小心使用它们。
答案 1 :(得分: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;
}