跳转至

ev-mold-variant-defsym-parse-001

字段 值
项目 rui314/mold
固定 commit 27162691b71a
路径 src/cmdline.cc
行段 L530-L544
特性 std::variant
许可证 MIT
代码来源 项目源码
级别 manual
审核 zyuhao7 @ 2026-10-25
测试代码 否
发现方式 tree-sitter

用法

用 std::variant 表达“符号引用或数值地址”两种互斥结果

为什么典型

函数返回 variant,两个分支直接 return 对应类型,由 variant 的转换构造选择活动成员,调用方无需额外的标签字段。

摘录

template <typename E>
static std::variant<Symbol<E> *, u64>
parse_defsym_value(Context<E> &ctx, std::string_view s) {
  if (s.starts_with("0x") || s.starts_with("0X")) {
    size_t nread;
    u64 addr = std::stoull(std::string(s), &nread, 16);
    if (s.size() != nread)
      return {};
    return addr;
  }

  if (s.find_first_not_of("0123456789") == s.npos)
    return (u64)std::stoull(std::string(s), nullptr, 10);
  return get_symbol(ctx, s);
}

备注

生产路径;--defsym 的右值既可以是符号名,也可以是地址常量,variant 把两种语义收进同一返回类型。

查看固定 commit 源码 · 返回证据索引