Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';在gdb中的宏中使用枚举时,类的完全限定名是否有效?_C++_Enums_Macros_Gdb - Fatal编程技术网

C++ 为什么';在gdb中的宏中使用枚举时,类的完全限定名是否有效?

C++ 为什么';在gdb中的宏中使用枚举时,类的完全限定名是否有效?,c++,enums,macros,gdb,C++,Enums,Macros,Gdb,我不是问如何将枚举转换为字符串。我想问的是,在将枚举转换为字符串的特殊情况下,为什么不能使用完全限定类名的作用域 我遇到了一个将枚举转换为字符串的宏问题。例如 颜色等级h class color_class { public: enum colors_e { RED, GREEN, BLUE}; }; #define colors__TO_STRING(color) \ (color == color_class::RED) ? "RED" : \ (color == color

我不是问如何将枚举转换为字符串。我想问的是,在将枚举转换为字符串的特殊情况下,为什么不能使用完全限定类名的作用域

我遇到了一个将枚举转换为字符串的宏问题。例如 颜色等级h

class color_class
{
  public:
     enum colors_e { RED, GREEN, BLUE};
};

#define colors__TO_STRING(color) \
(color == color_class::RED) ? "RED" : \
(color == color_class::GREEN) ? "GREEN" : \
(color == color_class::BLUE) ? "BLUE" : "";
我遇到的问题是,有时“color\u class::RED”是正确的表达式,但有时color\u class前缀是错误的。这是我无法理解的。我不知道为什么完全限定名并不总是有效。当然,我可以重新定义宏来检查color_class::RED和RED,但是如果我总是为colors类型的值指定一个完全限定的名称,为什么会丢失该名称?谢谢你的解释

为了进一步澄清,当我使用gdb时,我看到以下输出:

ptype test_color
type = enum color_class::colors_e {RED, GREEN, BLUE}
p test_color == RED
$1 = true
p test_color == color_class::RED
There is no field named 'RED'
p colors__TO_STRING(test_color)
There is no field named 'RED'

macro define color__SIMPLE_STRING(color) (color == RED) ? "RED" : (color==GREEN) ? "GREEN" : (color == BLUE) ? "BLUE" : "";
p color__SIMPLE_STRING(test_color)
$2 = ""

可能的重复项您确定在使用宏之前加载了声明在中的任何头文件color_类吗?命名空间是否存在问题?宏不知道名称空间,但主编译器知道。如果颜色类是在名称空间内定义的,在名称空间外使用宏可能会导致问题,不是吗?定义“不工作”。你有编译器错误吗?如果是,请显示您正在编译的代码以及错误的确切文本。如果
RED!=color\u class::RED
,这意味着您的程序中有另一个名为
RED
的实体,与
color\u class::RED
的可能重复项无关。您确定在使用宏之前加载了声明中的任何头文件color\u class吗?命名空间是否存在问题?宏不知道名称空间,但主编译器知道。如果颜色类是在名称空间内定义的,在名称空间外使用宏可能会导致问题,不是吗?定义“不工作”。你有编译器错误吗?如果是,请显示您正在编译的代码以及错误的确切文本。如果
RED!=color\u class::RED
,这意味着程序中的某个地方有另一个名为
RED
的实体,与
color\u class::RED