通过静态成员名称覆盖全局变量名称

时间:2012-03-11 14:40:19

标签: c++

如果在Visual Studio的c ++文件中包含windows.h,则会定义一个名为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用作成员变量名称,如果是,如何使用?

3 个答案:

答案 0 :(得分:1)

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

static int 0x001F0000 /*STANDARD_RIGHTS_ALL*/;

这是废话。

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

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

答案 1 :(得分: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);
};

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

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

答案 2 :(得分: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);
};

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