【问题标题】:getting the size of a const char* const a[30] has trouble determining size before object initialization [closed]获取 const char* const a[30] 的大小在对象初始化之前无法确定大小 [关闭]
【发布时间】:2016-05-10 16:39:19
【问题描述】:

下面的代码部分无法根据数组是否为静态来检索数组的大小。

struct foo
{
    static const char* const a[30];
    const char* const b[30];
    const int ia = __countOf(a) // compiles
    const int ib = __countOf(b) // has compile errors related to initialization
};

【问题讨论】:

  • “不编译”是描述问题的最佳方式吗?
  • 示例编译成功。
  • 请提供MCVE 和完整的错误信息。
  • 在此处将输出窗口 (Alt-2) 中的错误消息文本复制到您的问题中。
  • 这是一个程序员的错误。

标签: c++ c++11 visual-c++


【解决方案1】:

上面的最小示例确实可以编译...

但您真正要问的是“为什么当我引用 foo::b 时它不编译”?

这是因为所有 const 成员都必须在构造函数中初始化(实际上是在构造函数的初始化列表中,而不是在主体中)。

从 c++11 开始,您可以在类定义中提供默认值:

#include <iostream>

struct foo
{
    static const char* const a[30]; // compiles 
    const char* const b[30] = {"Hello", "World" /*insert others here */ };
};


const char* const foo::a[30] = {
  "Hello", "Cruel", "World", /* etc */
};

int main()
{
  foo f;
  std::cout << f.b[0] << std::endl;
  std::cout << f.a[2] << std::endl;
  return 0;
}

【讨论】:

  • 嗯,编译包括链接阶段,不是吗?
  • @πάνταῥεῖ 问题中发布的代码也为我链接。没有引用缺少的成员定义。
  • 当然,如果没有引用,链接器不会抱怨。但 OP 可能错过了指出它实际上在某处被引用。
  • @user1881587 WTH 是__countof ??
  • @user1881587 对不起,伙计,没有什么比询问不在问题中的代码更快地降低“暂停”锤子了。我对这个问题无能为力,因为它已被否决(不是我!)。也许发布另一个问题,其中包含一个最小、完整的程序(即 15 行)来显示您遇到的问题?
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多