sha*_*oth 8 c++ static const visual-c++
在VC++中,当我需要指定一个绑定类成员变量的数组时,我这样做:
class Class {
private:
static const int numberOfColors = 16;
COLORREF colors[numberOfColors];
};
Run Code Online (Sandbox Code Playgroud)
(请不要告诉我在这里使用std :: vector)
这样我就有了一个常量,可以用作数组绑定,稍后在类代码中指定循环语句约束,同时在其他任何地方都不可见.
问题是static const int成员变量的这种用法是仅由VC++允许还是其他广泛编译器通常允许的?
Boj*_*nik 13
这是有效的C++,大多数(所有?)合理的现代编译器都支持它.如果您使用的是boost,则可以以BOOST_STATIC_CONSTANT宏的形式获得此功能的便携支持:
class Class {
private:
BOOST_STATIC_CONSTANT(int, numberOfColors = 16);
COLORREF colors[numberOfColors];
};
Run Code Online (Sandbox Code Playgroud)
static const int numberOfColors = 16如果编译器支持此宏,则扩展为宏,否则将转向enum { numberOfColors=16 };.
我相信Visual Studio 2005及更高版本支持它.XCode C++编译器(实际上是gcc).
如果你想要安全,你总是可以使用我从Effective C++学到的旧的enum hack.它是这样的:
class Class {
private:
enum {
numberOfColors = 16
};
COLORREF colors[numberOfColors];
};
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
是的,它 100% 合法并且应该是便携式的。C++ 标准在 5.19 - 常量表达式中说了这一点”(强调我的):
在一些地方,C++ 需要计算结果为整数或枚举常量的表达式:作为数组边界 (8.3.4, 5.3.4)、作为 case 表达式 (6.4.2)、作为位字段长度 (9.6)、作为枚举数初始值设定项 (7.2)、静态成员初始值设定项 (9.4.2) 以及整数或枚举非类型模板参数 (14.3)。
Run Code Online (Sandbox Code Playgroud)constant-expression: conditional-expression整型常量表达式只能涉及用常量表达式 ( 8.5)初始化的整型或枚举类型的文字 (2.13)、枚举数、const 变量或静态数据成员、整型或枚举类型的非类型模板参数以及 sizeof 表达式。
也就是说,VC6 似乎不支持它。请参阅StackedCrooked 的答案以获得良好的解决方法。事实上,我通常更喜欢enumStackedCrooked 提到的这种类型的方法。
仅供参考,“ static const”技术适用于 VC9、GCC 3.4.5 (MinGW)、Comeau 和 Digital Mars。
并且不要忘记,如果您使用“static const”成员,严格来说,除了声明之外,您还需要它的定义。然而,在这种情况下,几乎所有编译器都会让您跳过定义。