C++ 为什么';在gdb中的宏中使用枚举时,类的完全限定名是否有效?
我不是问如何将枚举转换为字符串。我想问的是,在将枚举转换为字符串的特殊情况下,为什么不能使用完全限定类名的作用域 我遇到了一个将枚举转换为字符串的宏问题。例如 颜色等级hC++ 为什么';在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
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