为什么C++不允许在 ::之后使用常量?

Why doesn't C++ allow const after ::?

本文关键字:常量 之后 不允许 为什么 C++      更新时间:2023-10-16

伙计们,

问题陈述 - 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 中使用.相同的方式使用::

看起来您真的不了解范围解析运算符的作用或工作原理。

::有一个非常具体且非常有限的用法。在您更好地理解它之前,我们将很难帮助您。