【发布时间】:2023-04-11 03:00:01
【问题描述】:
有没有办法反转#define指令?
在下面的例子中
#define ZERO 0
#define ONE 1
#define TWO 2
#define THREE 3
是否可以从整数值 2 中检索两个?
此示例来自 C 代码,但如果需要,我可以使用一些 C++ 代码。我的目标是能够分解这种形式的一些虚假的 switch-case 循环:
switch(num)
{
case ZERO:
return std::to_string(foo.V_ZERO);
case ONE:
return std::to_string(foo.V_ONE);
case TWO:
return std::to_string(foo.V_TWO);
case THREE:
return std::to_string(foo.V_THREE);
}
其中 foo 是这样的结构的一个实例:
struct Foo
{
union Val
{
int V_ZERO;
int V_ONE;
double V_TWO; // nonsense: just to say that types are not the same
int V_THREE;
};
};
我的限制如下:
- 我无法删除#define 提供的功能,即我可以写一些等效的东西,例如一个枚举,但我不能丢失 ZERO 和 0、ONE 和 1 等之间的映射;
- 现有代码是用 C 编写的,我无法用 C++ 重写它。不过,我可以编写一些补充的 C++ 代码。
我有一些简化代码的想法,但我想知道是否有一种众所周知的优雅方法可以做到这一点,尤其是通过一些模板或预处理器指令。
编辑:添加 std::to_string 的用法表示我对知道如何转换或处理联合中的多种类型不感兴趣。
【问题讨论】:
-
请在编程中定义优雅的方式。当一个人使用
PUSH ADDR; RET只是为了进行间接的子程序调用时,它应该被称为优雅吗??
标签: c++ c c-preprocessor unions