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 被定义了多次,其中一个被忽略了。我需要在类中定义它,因为我需要初始化数组。或者,我需要使用枚举方法来做到这一点。但我想知道这是否可能?
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 被定义了多次,其中一个被忽略了。我需要在类中定义它,因为我需要初始化数组。或者,我需要使用枚举方法来做到这一点。但我想知道这是否可能?
我猜你正在使用 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
你给出了相互矛盾的定义。通过在类定义中给变量一个值,你说它是一个不需要任何存储的编译时常量。然后,您尝试将其存储在 .cpp 文件中。
把它从 .cpp 中取出,你会没事的。只是不要尝试获取它的地址。