0
A.h

class A  
{  
   private:
     static const int b = 50;
     int c[b];
 };

 A.cpp

 #include "A.h"
 const int A::b;

 C.cpp

 #include "A.h"

编译器向我发出警告,说 b 被定义了多次,其中一个被忽略了。我需要在类中定义它,因为我需要初始化数组。或者,我需要使用枚举方法来做到这一点。但我想知道这是否可能?

4

2 回答 2

6

我猜你正在使用 Visual C++,它有一个相当可怕的语言扩展,如“Microsoft Extensions to C and C++”中所述:

静态常量积分(或枚举)成员的类外定义

在标准(/Za)下,您需要对数据成员进行类外定义。例如,

class CMyClass {
    static const int max = 5;
    int m_array[max];
}
...
const int CMyClass::max;   // out of class definition

在 下/Ze,类外定义对于静态、常量整数和常量枚举数据成员是可选的。只有静态和 const 的整数和枚举才能在类中具有初始化器;初始化表达式必须是 const 表达式。

为避免在提供类外定义时出现错误(当在头文件中提供类外定义并且该头文件包含在多个源文件中时),您应该使用 selectany。例如:

__declspec(selectany) const int CMyClass::max = 5;

默认情况下启用该/Ze标志。/Za如果您不想要语言扩展,则必须明确使用该标志。

编写的代码使用带有/Za标志集的 g++ 4.5.2、Clang 3.0 和 Visual C++ 2010 按原样编译和链接,没有错误。

/Za如果您想使用 Visual C++ 编译,从 .cpp 文件中删除定义可以解决问题,但是如果您尝试使用数据成员,它将无法与其他编译器(或)一起使用。对于可移植的解决方法,您可以使用条件编译块来检查是否启用了扩展:

#ifndef _MSC_EXTENSIONS
const int A::b;
#endif
于 2011-04-09T02:17:45.333 回答
0

你给出了相互矛盾的定义。通过在类定义中给变量一个值,你说它是一个不需要任何存储的编译时常量。然后,您尝试将其存储在 .cpp 文件中。

把它从 .cpp 中取出,你会没事的。只是不要尝试获取它的地址。

于 2011-04-09T02:42:29.213 回答