You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据值获取#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:20:35