如何根据值获取#define宏的名称?
解决方案
方案1:建立值与宏名的映射表
因为#define是预处理指令,编译后宏名会被直接替换成对应的值,程序运行时无法直接通过值反向查找原始宏名。所以最直接的方法是手动维护一个值到宏名称的映射关系,通过函数查询输出:
#include <iostream> #include <map> #include <string> #define ten 10 #define five 5 #define twenty 20 std::string printName(int value) { static const std::map<int, std::string> valueToName = { {ten, "ten"}, {five, "five"}, {twenty, "twenty"} }; auto it = valueToName.find(value); if (it != valueToName.end()) { return it->second; } return "unknown"; // 没有匹配值时返回默认内容 } int main() { std::cout << printName(10) << std::endl; // 输出 ten std::cout << printName(5) << std::endl; // 输出 five std::cout << printName(99) << std::endl; // 输出 unknown return 0; }
方案2:用宏直接获取传入的宏名称(仅支持传宏本身)
如果调用时直接传入宏(而非字面量值),可以利用预处理的字符串化操作#来直接获取宏名,这种方式不需要维护映射表,但只能处理直接传宏的场景:
#include <iostream> #include <string> #define ten 10 #define five 5 // 定义辅助宏,实现字符串化 #define PRINT_NAME_MACRO(val) #val // 外层宏用于展开传入的宏,确保先替换宏值再字符串化 #define printName(val) PRINT_NAME_MACRO(val) int main() { std::cout << printName(ten) << std::endl; // 输出 ten std::cout << printName(five) << std::endl;// 输出 five // 注意:如果传字面量10,会直接输出"10"而不是"ten" std::cout << printName(10) << std::endl; // 输出 10 return 0; }
两种方案对比
- 方案1:支持传入字面量或变量,能反向查找宏名,但需要手动维护映射表,新增宏时要同步更新映射。
- 方案2:无需维护映射,代码更简洁,但仅支持直接传入宏的场景,传入字面量会输出值本身。
内容的提问来源于stack exchange,提问作者Omid_Dev
相关产品推荐
相关产品推荐

