在类中定义整型静态const,该类的.h文件包含在多个CPP文件中

defining integral static const in a class whose .h file is included in multiple cpp files

本文关键字:文件包 CPP 文件 整型 定义 静态 const      更新时间:2023-10-16
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++ "中所描述的:

静态const整型(或enum)成员的类外定义

在标准(/Za)下,您需要为数据成员创建一个类外定义。例如,

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

/Ze中,对于static、const integral和const enum数据成员,类外定义是可选的。只有静态型和const型的整型和枚举型可以在类中拥有初始化式;初始化表达式必须是const表达式。

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

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

默认开启/Ze标志。如果您不想要语言扩展,则必须显式地使用/Za标志。

使用g++ 4.5.2、Clang 3.0和Visual c++ 2010设置/Za标志时,代码按原样编译和链接没有错误。

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

#ifndef _MSC_EXTENSIONS
const int A::b;
#endif

您给出了相互矛盾的定义。通过在类定义中给变量赋一个值,就表示它是一个编译时常量,不需要任何存储空间。然后你试图把它存储在。cpp文件中。

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