关键在于选对载体、控制粒度、屏蔽平台差异:统一用字符串或定长字节数组作i/o,导出纯函数并分层隔离接口与实现,辅以json schema定义跨端类型契约,构建时通过预编译条件注入平台适配逻辑。

直接用 export 封装 64 位大整数计算逻辑,关键不在“导出语法”,而在于**选对载体、控制粒度、屏蔽平台差异**。C++20 模块、TypeScript 命名导出、甚至 Node.js 的 exports 都能用,但必须围绕“跨端一致性”设计接口,而非简单贴上 export 标签。
明确导出边界:只暴露无副作用的纯计算函数
原始 C++ 或 Rust 实现的大整数运算(如加减乘除、模幂、比较)通常依赖底层字节操作或编译器内置类型(__int128、u128)。跨端封装时,绝不能导出裸指针、内存布局或平台相关宏。
- 统一输入输出为 字符串或定长字节数组(如
std::string表示十进制/十六进制,或std::array<uint8_t></uint8_t>表示小端 64 位整数) - 所有导出函数标记为
constexpr(C++20)或pure(TS 声明),确保无状态、可缓存 - 避免导出类模板实例化体;改用导出
using别名或工厂函数
分层导出:接口层与实现层物理隔离
不把算法代码和平台适配混在一起。例如:
-
模块接口单元(
bigint_calc.ixx)仅含:export module bigint_calc;export int64_t add_i64(int64_t a, int64_t b);export std::string mul_str(const std::string& a, const std::string& b); -
私有实现单元(
bigint_calc_impl.cpp)内部分发逻辑:
Windows 下调用_add64内在函数,WASM 下用手工展开的 32×32 乘法,Node.js 绑定则桥接到BigInt原生 API
跨端一致的类型契约:用语言无关 schema 约束行为
导出的函数签名本身不是契约,它的 JSON Schema 才是。例如为 div_mod 导出配套文档:
该 schema 同时用于生成 TypeScript 类型定义、Rust #[derive(Serialize)] 结构、以及前端表单校验规则,确保各端对“什么是合法输入”理解完全一致。
构建时注入:用 export + 预编译条件分离平台路径
C++20 支持模块分区与私有片段,可结合预处理器做轻量适配:
- 主模块接口中只导出通用声明
- 在
module : private;片段里写:#ifdef __wasm__static inline uint64_t platform_add(uint64_t a, uint64_t b) { return a + b; }#elif defined(_WIN32)static inline uint64_t platform_add(...) { ... }#endif - 导出函数内部只调用
platform_add,不暴露条件分支










