将全局变量名替换为静态成员名 如果在VisualStudio中的C++文件中包含Windows .h,那么它们将定义一个全局标识符,称为StaldRayReSysL.我想将该名称用作我正在创建的类中静态成员变量的名称。我试着按如下方式做 class ACLAmigo { public: static int STANDARD_RIGHTS_ALL; ACLAmigo(void); ~ACLAmigo(void); };

将全局变量名替换为静态成员名 如果在VisualStudio中的C++文件中包含Windows .h,那么它们将定义一个全局标识符,称为StaldRayReSysL.我想将该名称用作我正在创建的类中静态成员变量的名称。我试着按如下方式做 class ACLAmigo { public: static int STANDARD_RIGHTS_ALL; ACLAmigo(void); ~ACLAmigo(void); };,c++,C++,稍后在另一个文件中我有这个 int ACLAmigo::STANDARD_RIGHTS_ALL = 1; 但是IDE抱怨道:“错误:需要一个标识符” 问题:我可以使用这个已经声明的标识符STANDARD\u RIGHTS\u ALL作为成员变量名吗?如果可以,如何使用?问题是STANDARD\u RIGHTS\u ALL(以及大多数其他内容)是宏。宏总是“全局定义的”。此外,在编译器开始分析您的代码之前,预处理器会解决这些问题,从而使您的代码变成: static int 0x001F0000

稍后在另一个文件中我有这个

int ACLAmigo::STANDARD_RIGHTS_ALL = 1;
但是IDE抱怨道:“错误:需要一个标识符”


问题:我可以使用这个已经声明的标识符STANDARD\u RIGHTS\u ALL作为成员变量名吗?如果可以,如何使用?

问题是
STANDARD\u RIGHTS\u ALL
(以及大多数其他内容)是宏。宏总是“全局定义的”。此外,在编译器开始分析您的代码之前,预处理器会解决这些问题,从而使您的代码变成:

static int 0x001F0000 /*STANDARD_RIGHTS_ALL*/;
这是胡说八道

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

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

好吧,因为
STANDARD\u RIGHTS\u ALL
实际上是一个宏:

#define STANDARD_RIGHTS_ALL              (0x001F0000L)
我得说没有安全的方法

您可以取消定义它:

#undef STANDARD_RIGHTS_ALL
class ACLAmigo
{
public:
    static int STANDARD_RIGHTS_ALL;
    ACLAmigo(void);
    ~ACLAmigo(void);
};
但是如果你选择一个不同的名字,你会过得更好


事实上,取消定义标准宏是未定义的行为。这不是标准宏,但也可能导致未定义的行为。您肯定应该更改名称。

在您的示例中,您将其设置为1,但我认为您实际上希望将其设置为标准的\u RIGHTS\u 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);
};

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

STANDARD\u RIGHTS\u ALL可能是一个宏。您可以#取消它的定义,但您可能会自找麻烦。感谢您,事实上它是一个“#定义标准权利(0x001F0000L)”。实际上,我无法取消定义它,因为我想使用宏名称将变量设置为该值(define是一个宏,对吗?)。如果我在变量名前添加下划线,它就会起作用。如果我必须的话,我会接受的,但不必这样做会很好。我已经添加了一个解决这个问题的答案。习惯上,宏都是大写的,以便将它们与常规变量区分开来。当然,如果你对正则变量使用所有的大写,这些都会被浪费掉,所以我建议不要这样做:这样你会避免冲突<代码>标准权利所有的或标准权利都会起作用,不是吗?是的,谢谢,这些名字会起作用的。我希望windows.h中的名称与我使用的名称保持一致,但现在我发现这是一个不可能实现的梦想。边做边学…谢谢。我正在更改变量的名称。分支问题:用所有大写字母命名常量静态类成员是否被视为标准/最佳实践?谢谢。我正在更改变量的名称。分支问题:是否认为使用所有大写字母为常量静态类成员命名是一种标准/最佳实践?取决于惯例。我个人不这么认为。我坚持静态成员带有前缀的惯例