d有趣的版本小黑客
import std;
version(traceFuncCalls)
{
// 从中提取参数元组的假函数
void locusFunc(string file = __FILE__, size_t line = __LINE__,string func = __FUNCTION__);
// 绑定参数声明到别名
static if (is(typeof(locusFunc) Params == __parameters))
alias Locus = Params;
else
static assert(0, "非函数");
}
else
alias Locus = AliasSeq!();
// 根据是否用-version=traceFuncCalls编译
// 可选地注入默认参数
void realFunc(string someOther, int args, Locus locus) {
if (locus.length > 0)
writefln("Locus = %s %s %s", locus);
else
writeln("无位置");
}
void main() {
realFunc("", 0);
//看呀!调用者中自动跟踪位置
}
用/不用
,-version=traceFuncCalls
选项编译来查看效果.基本上,有了该版本,Locus
注入3个默认参数到realFunc
的函数调用中.当*不*
使用-version
编译时,Locus
是空元组,并从realFunc
的参数列表中删除了自己.因此无运行时
成本:额外参数甚至未传递给realFunc
.只有使用-version
编译时,才会自动插入额外的参数.
对-profile=gc
情况,这是很好解决方案:只有使用-profile=gc
编译时,才注入这些额外参数
到Phobos
函数中(此时,更改dmd
版本为预定义version=D_ProfileGC
,上面版本测试可以改成它),否则不会传递额外参数,也不产生额外成本.
上述技巧不适用于模板函数
,因为别名阻碍了IFTI
,且未提供默认参数
时无法匹配实例模板
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现