-2

伙计们,

问题陈述 - C++ 是否允许(静态)const 限制在类范围内,所以我可以摆脱污染整个命名空间的#defines?

我的观察结果是否定的(在以下不同的示例中),我想找出原因以及最好的选择是什么。VS 生成错误 C2589: 'const' : '::' 右侧的非法令牌

例 1

// 啊

A类{

…
.. 
static const uint_32 myConst = 1234;

};

//b.cpp

包括“啊”</h1>

… B() { uint32_t arr[A::myConst]; // C2589!const : '::' 右侧的非法标记 }

例 2

// 啊

A类 { ... .. enum blah { ... myConst = 1234, .. }; };

//b.cpp

包括“啊”</h1>

... B() { uint32_t arr[A::myConst]; // C2589!const : '::' 右侧的非法标记 }

4

3 回答 3

12

当您使用宏时:

#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;
};

最好的办法是完全取消宏,然后修改代码以使用正确的常量,就像你在这里尝试做的那样。不要混搭。至少,不要为成员使用与宏相同的名称。

于 2013-11-08T18:48:36.800 回答
7

首先你的类被称为A大写A,不是a。类名用于限定您尝试使用的常量。因此,将您的代码更改为使用A::CONST. 顺便说一句,这是 C++ 而不是 C# 或 Java,所以没有 . 之类的东西Int,除非出于某种奇怪的原因,您决定发明自己的整数类型。

顺便说一句,使用全部大写来命名常量可能会与宏发生冲突,并且是陷入麻烦的好方法,特别是因为首先进行预处理并且宏被替换为常量的所有情况。这通常会导致无效的 C++ 代码带有难以理解的语法错误。这就是为什么你永远不应该使用全部大写来命名常量,因为这是宏最常用的约定。

于 2013-11-08T18:49:14.597 回答
0

如果我可以猜测一下,看起来您正在尝试使用与Python::中相同的方式。.

看起来你真的不明白范围解析运算符的作用,或者它是如何工作的。

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

于 2013-11-08T18:51:35.503 回答