d导入c的示例2
原文
简化示例:
--- lib.c
int f(int x) { return x + 1; }
--- app.d
import lib;
typeof(&__traits(getMember, lib, "f")) fptr;
pragma(msg, typeof(fptr));
// extern (C) int function(int x)
简化示例:
--- lib.c
int foo( void );
typedef int Bar(const void *input);
--- main.d
import lib;
import std.meta;
import std.traits;
template FuncType(alias symbol) {
alias FuncType = typeof(&symbol);
}
template GetFunctionList(alias Module) {
alias GetFunctionList = AliasSeq!();
static foreach (idx, member; __traits(allMembers, Module)) {
static if (isFunction!(__traits(getMember, Module, member))) {
GetFunctionList = AliasSeq!(GetFunctionList, typeof(&__traits(getMember, Module, member)));//有问题.
}
}
}
alias X = GetFunctionList!lib;
void main() { }
这里问题是:std.traits.isFunction
并没有完全按你的假设.即,它对函数符号和类型
都求值为true
:
import std.traits;
void fun() {}
static assert(isFunction!fun); // ok
static assert(isFunction!(typeof(fun))); // also ok!
//函数符号与函数类型
为了仅过滤函数符号
,需要用更精细测试
:
static if (
is(typeof(&__traits(getMember, Module, member)) PtrType)
&& isFunctionPointer!PtrType
) {
GetFunctionList = AliasSeq!(GetFunctionList, PtrType);
}
先检查是否可取成员地址
,然后,如果可以,检查该地址的类型
是否为函数指针
.如果我在你的简化示例
中使用上述条件
,它会成功编译
,并且结果列表不包含typedef
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现