2012-03-11 112 views
1

如果一个包括WINDOWS.H在Visual Studio中的C++文件食一个全局变量的名字,他们然后有一个名为STANDARD_RIGHTS_ALL定义的全局标识符。我想在我创建的类中使用该名称作为静态成员变量的名称。我试图做如下...由静态成员名称

class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

后来在另一个文件我有这个...

int ACLAmigo::STANDARD_RIGHTS_ALL = 1; 

但正是如此IDE抱怨:“错误:预期的标识符”。

问:我可以用这个已经声明标识符STANDARD_RIGHTS_ALL作为成员变量名,如果是的话怎么办?

+2

STANDARD_RIGHTS_ALL可能是一个宏。你可以#undef它,但你可能会遇到麻烦。 – 2012-03-11 14:47:03

+0

其实这是一个“#define STANDARD_RIGHTS_ALL(0x001F0000L)”。我实际上不能解开它,因为我想使用宏名称将我的变量设置为该值(一个#define是一个宏是否正确?)。如果我在我的变量名称前添加一个下划线,它将起作用。如果我愿意的话,我会接受这一点,但不必非得这么做。 – 2012-03-11 14:49:44

+0

我已经添加了一个处理该问题的答案。 – 2012-03-11 15:00:30

回答

1

问题是,STANDARD_RIGHTS_ALL(和大多数其他事情)是。宏始终是“全局定义的”。此外,在编译器开始分析代码之前,它们将由预处理器解析,以便您的代码变为:

static int 0x001F0000 /*STANDARD_RIGHTS_ALL*/; 

这是无意义的。

要么选择另一个变量名,或取消定义该宏:

#undef STANDARD_RIGHTS_ALL 
static int STANDARD_RIGHTS_ALL; // now it's ok 
+0

谢谢。我正在改变我的变量的名称。分支问题:是否将持久静态类成员名称设置为全部大写是否被认为是标准/最佳实践? – 2012-03-11 17:49:07

+0

取决于公约。我个人不会这样。我坚持使用's_'作为前缀的静态成员会议 – valdo 2012-03-11 20:28:33

1

好吧,既然STANDARD_RIGHTS_ALL实际上是一个宏:

#define STANDARD_RIGHTS_ALL    (0x001F0000L) 

我会说有做的不安全方式它。

你可以取消定义它:

#undef STANDARD_RIGHTS_ALL 
class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

但是你掉,如果你只是选择一个不同的名字要好得多。

事实上,这是不确定的行为取消定义标准宏。这不是一个标准的宏,但也可能导致未定义的行为。你一定要改名字。

+0

谢谢。我正在改变我的变量的名称。分支问题:是否将持久静态类成员名称设置为全部大写是否被认为是标准/最佳实践? – 2012-03-11 17:48:39

1

在你的例子中,你将它设置为1,但我想你实际上想要将它设置为STANDARD_RIGHTS_ALL宏通常具有的值。

我想你可以完成,像这样:

class ACLAmigo 
{ 
public: 
    static const int standard_rights_all = STANDARD_RIGHTS_ALL; 
#undef STANDARD_RIGHTS_ALL 
    static const int STANDARD_RIGHTS_ALL = standard_rights_all; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

但是这很容易导致问题,如果这发生在被之前使用宏其他头文件包含的头文件。