【问题标题】:C++ Compile time specification of array size数组大小的 C++ 编译时间规范
【发布时间】:2022-01-12 22:39:34
【问题描述】:

我正在尝试创建一个结构来在头文件中的类的声明部分中保存文件头。这涉及计算编译时已知的值,我想用它来调整标头中的数组大小。

这是我最近尝试的头文件的摘录:

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;

但它告诉我:

错误:非静态数据成员 'FBFile::hFreeSiz' 的使用无效

我可以手动计算,但我试图了解这里发生了什么 为什么这不起作用。谁能解释一下? (我猜如果我移动了 类外的常量声明,那么它会起作用,但我真的宁愿 让它靠近它用来修改的东西。事实上,如果这是唯一的 回答,然后我可能会计算 手动将其放入 cmets 中,说明为什么 特定的数字。)

【问题讨论】:

  • 通过非常小的修改(包括 cstdint,使 RId 成为一个空类),它可以用 VC++ 编译。此外,特别是,您的代码中不存在成员 FBFile::hFreeSiz,因此错误不是由您提供的代码生成的。请分享您试图寻求帮助的代码,而不是发明的东西。

标签: c++ arrays declaration


【解决方案1】:

现代方法是使用constexpr,告诉编译器它是一个实际的编译时常量。看一个更简单的例子:

constexpr int Size = sizeof(long) * 7;

class Foo
{
    int t[Size];
};

class Foo
{
    static constexpr int Size = sizeof(long) * 7;
    int t[Size];
};

【讨论】:

  • 我注意到您将常量声明移到了类的主体之外,我假设这会起作用。但我真的想让声明接近它修改的代码。
    FWIW,如果我将其更改为 constexpr,我会收到错误消息“非静态数据成员 'hFreeSiz' 声明为 'constexpr'。(实际上我已经开始尝试使用 constexpr,但这一点我并不清楚发布。)
  • 如果您将constexpr 放在类范围内,则需要将其设为static。否则,您是在告诉编译器该值可能因对象而异,这不是编译时。
猜你喜欢
  • 2013-11-15
  • 2010-09-14
  • 2011-05-19
  • 2012-04-19
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多