在类中定义整型静态const,该类的.h文件包含在多个CPP文件中
defining integral static const in a class whose .h file is included in multiple cpp files
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中取出来,你会没事的。只是不要试图获取它的地址
相关文章:
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 递归地将FEATURE_FLAG导出到生成文件、CPP 和头文件
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- 包括头文件或 cpp 文件
- "configure"脚本如何检测我的系统是否支持某些头文件或 cpp 功能?
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- 如何正确使用hpp文件和cpp文件中的嵌套类
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- C++文件中.cpp静态对象声明
- 从另一个.cpp文件启动.cpp文件
- 共享对象中的符号名称与文件中.cpp函数不同
- 如何在库项目中添加头文件和 cpp 文件
- C++继承 - 覆盖功能,包括使用 "::" s、.h 文件和.cpp文件
- AWS-开发工具包-CPP:未解析的符号
- 令牌之前的预期类名 '{' - 包含头文件和 CPP 文件
- 如何使用适用于 S3 的 AWS 开发工具包 cpp 异步 API?
- 在标题文件和CPP文件中都包含库
- GCC:为什么编译.HPP文件与.cpp文件的结果不同
- 在带有Rcpp的R包中,将头(.h)文件与cpp文件一起使用