【发布时间】:2019-01-26 08:32:24
【问题描述】:
背景
事实上,我正在将FLTK C 1.3.3 for FreeBASIC 移植到nimlang。请注意FLTK C 1.3.3 for FreeBASIC 是FLTK in CPP 上的C 接口。
DLL 中的许多函数都满足相同的类似名称格式,例如
#inclib "fltk-c-1.3.3-64" ' Windows 64-bit
function Fl_ButtonExNew (byval x as long, byval y as long, byval w as long, byval h as long, byval title as const zstring ptr=0) as Fl_ButtonEx Ptr
sub Fl_ButtonExDelete(byval x as Fl_ButtonEx ptr)
function Fl_BoxExNew (byval x as long, byval y as long, byval w as long, byval h as long, byval title as const zstring ptr=0) as Fl_BoxEx Ptr
sub Fl_BoxExDelete(byval x as Fl_BoxEx ptr)
and so on
似乎被删除的函数/子会自动加载 fltk-c-1.3.3-64.dll 中的同名函数(如果错了,请纠正我)
FreeBASIC 中的解决方案
所以在 FreeBASIC 标头 fltk-main.bi 中,有一个辅助宏
#macro DeclareEx(_name_)
declare function _name_##ExNew(byval x as long, byval y as long, byval w as long, byval h as long, byval title as const zstring ptr=0) as _name_##Ex ptr
declare sub _name_##ExDelete (byref ex as _name_##Ex ptr)
#endmacro
借助它,上述代码(和许多其他代码)可以通过简单的一行代码生成:
DeclareEx(Fl_Button)
DeclareEx(Fl_Box)
我在 nimlang 中的问题
在nimlang中(请暂时忽略数字类型转换),上面的代码可以手动翻译为
const fltk = "fltk-c-1.3.3-64.dll"
type long = int64
proc Fl_ButtonExNew (x: long, y: long, w: long, h: long, title: cstring=nil): Ptr Fl_ButtonEx {.cdecl, importc: "Fl_ButtonExNew", dynlib: fltk, discardable.}
proc Fl_ButtonExDelete(x: ptr Fl_ButtonEx) {.cdecl, importc: "Fl_ButtonExDelete", dynlib: fltk, discardable.}
proc Fl_BoxExNew (x: long, y: long, w: long, h: long, title: cstring=nil): Ptr Fl_BoxEx {.cdecl, importc: "Fl_BoxExNew", dynlib: fltk, discardable.}
proc Fl_BoxExDelete(x: ptr Fl_BoxEx) {.cdecl, importc: "Fl_BoxExDelete", dynlib: fltk, discardable.}
所以我尝试模仿 FreeBASIC 宏的作用
const fltk = "fltk-c-1.3.3-64.dll"
type long = int64
template DeclareEx*(name: untyped) {.dirty.}=
type `name Ex` = object
type `name ExNew`* = proc(x: long, y: long, w: long, h: long, title: cstring=nil): ptr `name Ex` {.cdecl, importc: "name New", dynlib: fltk, discardable.}
type `name ExDelete`* = proc(ex: ptr `name Ex`) {.cdecl, importc: "name ExDelete", dynlib: fltk, discardable.}
DeclareEx(Fl_Button)
但是当我编译它时,我得到了
d.nim(9, 10) 模板/通用实例化
DeclareEx从这里d.nim(6, 118) 错误:无效的编译指示:importc: "name New"
那么,有什么解决办法吗?谢谢
【问题讨论】:
标签: templates dll macros nim-lang