【问题标题】:Using static const + const as array bound使用 static const + const 作为数组绑定
【发布时间】:2012-01-20 08:26:26
【问题描述】:

我正在做这样的事情

类.hpp:

 class Class {

 private:
     static const unsigned int arraySize;
     int ar[arraySize+2];
 };

类.cpp:

#include <Class.hpp>
const unsigned int arraySize = 384;

编译器(q++,基于 g++ 的 QNX 操作系统的 c++ 编译器)在编译包含 Class.hpp 的单元时给了我error: array bound is not an integer constant(不是在编译 Class.cpp 时)。

为什么这不起作用?我知道静态 const 成员可以用作数组绑定,由 C++ 标准保证(请参阅this anwser)。但是为什么编译器看不到static const + const 的结果为常量呢?

【问题讨论】:

  • 对我来说编译得很好(gcc 4.6.1),因为它应该。可能是那个编译器的错误?
  • 我更新了我的示例以更好地匹配我的真实代码。也许arraySize的前向声明有问题?
  • 请看这里:DR#721。总是打算(并且在 C++11 中明确表示这种情况)常量的初始化程序应该在静态数据成员或常量变量用于使其限定为常量表达式的点处可见。跨度>

标签: c++ arrays qnx


【解决方案1】:

这是应该被编译器接受的好代码:

class Class { 
  const static int arraySize = 384; 
  int ar[arraySize+2]; 
}; 

如果不是,则说明您的编译器已损坏。

但是,如果您将实际常量从头文件中移出到选定的翻译单元,这会使代码无效。

// Class.h
class Class { 
  const static int arraySize;
  int ar[arraySize+2]; // ERROR
}; 

// Class.cpp
const int Class::arraySize = 384;

这是因为您的Class 对象的大小无法在编译时仅从标头中可用的数据确定。这不是完全正确的原因,但沿着这些思路进行推理有助于理解诸如此类的编译错误。

为避免出现此类错误,您可以将static const int 替换为enum,例如

class Class { 
  enum { arraySize = 384 }; 
  int ar[arraySize+2]; 
}; 

【讨论】:

  • 感谢您的解决方法。我自己就知道。但检查这是否是有效的 C++ 代码对我来说很重要。如果你是对的,那么我们可能会对向我们出售编译器的公司提出投诉。
  • 哦,您在问题中更改为代码。将常量从标题中移开会完全改变事情。我会更新我的答案以避免误导他人。
  • 谢谢。很抱歉造成混乱。
【解决方案2】:

正如评论所说,我很惊讶这实际上是在 gcc 上编译的。由于384 不在头文件中,因此其他编译单元不知道Class 的大小。在某些编译单元中可能无关紧要,具体取决于它们如何/是否使用Class,但我无法想象这种编译:

// this is a source file called, say, blah.cpp
#include <Class.hpp>

void someFunc()
{
    void *mem = malloc(sizeof(Class));  // size is not known, so this can't compile

    // do something with mem
}

你需要在你的 .hpp 中有:

class Class {

 private:
     static const unsigned int arraySize = 384;
     int ar[arraySize+2];
 };

.. 因为它在您链接到 here 的 OP 中。

【讨论】:

  • OP 更改问题。最初,常量是在标头中定义的。
  • 评论指的是我问题中示例代码的早期版本。但是,如果我直接在标题中定义我的静态常量,它编译得很好。所以你可以编辑你的答案,我会接受。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多