数组大小的 C++ 编译时规范
C++ Compile time specification of array size
我正在尝试创建一个结构来在 header 文件的 class 的声明部分中保存文件 header。这涉及计算在编译时已知的值,我想用它来调整 header.
中的数组大小
这是我最近一直在尝试的 header 文件的摘录:
const uint hFreeSiz = (1024 - sizeof(uint32_t) - sizeof (uint16_t)- sizeof (uint16_t) - sizeof(RId))/sizeof (RId);
template <const uint freedSiz>
struct FBHead
{
/** A magic number for the file. Indicates both class and version. */
uint32_t fSig;
/** The number of data bytes within each block. */
uint16_t blkSize;
/** The number of records available for reuse. */
uint16_t freedCnt;
/** The id number of the last record written to the file. */
RId lstRec;
RId freedRecs[freedSiz];
};
FBHead<hFreeSiz> fbHead;
但它告诉我:
error: invalid use of non-static data member 'FBFile::hFreeSiz'
我可以手工计算,但我想了解这里发生了什么
为什么这不起作用。谁能解释一下? (我猜如果我移动了
class 之外的常量声明,那么它会起作用,但我真的宁愿
让它靠近它用来修改的东西。事实上,如果这是唯一的
回答,然后我可能会计算
手工制作并评论为什么
具体号码。)
现代方法是使用 constexpr
,告诉编译器它是一个实际的编译时常量。看一个更简单的例子:
constexpr int Size = sizeof(long) * 7;
class Foo
{
int t[Size];
};
或
class Foo
{
static constexpr int Size = sizeof(long) * 7;
int t[Size];
};
我正在尝试创建一个结构来在 header 文件的 class 的声明部分中保存文件 header。这涉及计算在编译时已知的值,我想用它来调整 header.
中的数组大小这是我最近一直在尝试的 header 文件的摘录:
const uint hFreeSiz = (1024 - sizeof(uint32_t) - sizeof (uint16_t)- sizeof (uint16_t) - sizeof(RId))/sizeof (RId);
template <const uint freedSiz>
struct FBHead
{
/** A magic number for the file. Indicates both class and version. */
uint32_t fSig;
/** The number of data bytes within each block. */
uint16_t blkSize;
/** The number of records available for reuse. */
uint16_t freedCnt;
/** The id number of the last record written to the file. */
RId lstRec;
RId freedRecs[freedSiz];
};
FBHead<hFreeSiz> fbHead;
但它告诉我:
error: invalid use of non-static data member 'FBFile::hFreeSiz'
我可以手工计算,但我想了解这里发生了什么 为什么这不起作用。谁能解释一下? (我猜如果我移动了 class 之外的常量声明,那么它会起作用,但我真的宁愿 让它靠近它用来修改的东西。事实上,如果这是唯一的 回答,然后我可能会计算 手工制作并评论为什么 具体号码。)
现代方法是使用 constexpr
,告诉编译器它是一个实际的编译时常量。看一个更简单的例子:
constexpr int Size = sizeof(long) * 7;
class Foo
{
int t[Size];
};
或
class Foo
{
static constexpr int Size = sizeof(long) * 7;
int t[Size];
};