为什么C++不允许在 ::之后使用常量?
Why doesn't C++ allow const after ::?
伙计们,
问题陈述 - C++是否允许将(静态)const 限制在类范围内,以便我可以摆脱污染整个命名空间 #defines?
我的观察是否定的(在以下不同的示例中),我想找出原因以及什么是最佳选择。VS 生成错误 C2589:"const"::"右侧的非法令牌
EXAMPLE1
//a.h
A类{
…
..
static const uint_32 myConst = 1234;
};
//b.cpp
包括"a.h"
。B(){ uint32_t arr[A::myConst]; C2589! const : ':: '右侧的非法令牌}
例 2
//a.h
A类{ ... .. 枚举废话 { ... myConst = 1234, .. };};
//b.cpp
包括"a.h"
。B(){ uint32_t arr[A::myConst]; C2589! const : ':: '右侧的非法令牌}
当您获取宏时:
#define CONST 1234
并将其替换为您使用它的位置:
static const int CONST = 1234;
最终结果是无稽之谈:
static const int 1234 = 1234;
在另一个实例中:
Int a1[a::CONST];
这也变成了无稽之谈:
Int a1[a::1234];
这一切都引出了一个问题,你想做什么?
看起来您正在尝试创建一个与宏同名的成员变量,CONST
,在这里:
class A
{
static const int CONST = 1234;
};
但是,由于在编译此代码时已经定义了宏,因此预处理器通过在编译器本身破解宏之前替换宏来更改宏。 编译代码时,它看起来像这样:
class A
{
static const int 1234 = 1234;
};
最好是完全取消宏,然后修改代码以使用正确的常量,就像您在这里尝试的那样。 不要混搭。 至少,不要对成员使用与宏相同的名称。
首先你的类被称为A
,如大写A
,而不是a
。类名用于限定您尝试使用的常量。因此,更改您的代码以使用 A::CONST
.顺便说一下,这C++不是C#或Java,所以没有Int
这样的东西,除非出于某种奇怪的原因你决定发明自己的整数类型。
顺便说一句,使用所有大写字母来命名常量可能会与宏发生冲突,并且是遇到麻烦的好方法,特别是因为预处理首先发生,并且宏被替换为常量的所有情况。这通常会导致无效的C++代码,其中包含难以理解的语法错误。这就是为什么永远不要使用全部大写字母来命名常量,因为这是宏最常用的约定。
如果我可以猜测的话,看起来你正在尝试以与在 Python 中使用.
相同的方式使用::
。
看起来您真的不了解范围解析运算符的作用或工作原理。
::
有一个非常具体且非常有限的用法。在您更好地理解它之前,我们将很难帮助您。
- #定义c-预处理器常量..我做错了什么
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 是默认情况下分配给char数组常量的值
- 在循环C++中指定字符串之后,不会打印该字符串
- 私有类型的静态常量成员
- 键入名称应该在 C++ 中常量之前还是之后
- 类型之前或之后的常量
- 在声明C++之后初始化常量变量
- 为什么C++不允许在 ::之后使用常量?
- 在方法名称之前或之后放置常量、静态和虚拟
- 参数之前的常量与函数名称 C++ 之后的常量