在 Nim 中使用前向声明的原型分配函数指针

ili*_*rit 4 function-pointers forward-declaration nim-lang

我想将一个窗口过程分配给一个窗口类结构:

var wndClass : WNDCLASS;

wndClass.lpszClassName = CLASSNAME;
wndClass.lpfnWndProc   = WndProc;
wndClass.hInstance     = hInstance;
Run Code Online (Sandbox Code Playgroud)

我还不能分配 WndProc,因为它还没有被声明。当我使用前向声明(此处描述)时:

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error: type mismatch: got (None) but expected 'WNDPROC'
Run Code Online (Sandbox Code Playgroud)

我的前向声明是错误的,还是在这种情况下我必须先编写函数?

编辑:

作为参考,以下代码适用于全局范围:

proc Foo : int32;

var bar = Foo();
var baz = Foo;

echo bar;
echo baz();

proc Foo : int32 =
    return 4;
Run Code Online (Sandbox Code Playgroud)

WNDCLASS 和 WNDPROC 的定义可以在这里找到:http ://nim-lang.org/windows.html

ili*_*rit 5

问题是即使 WNDPROC 的类型定义包含编译指示,您也必须在前向声明中重复它们。

此代码编译:

import windows

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT {.stdcall.}

var wndClass : WNDCLASS;
wndClass.lpfnWndProc   = WndProc;

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT = 0
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您尝试通过在文件中包含类型来重现问题,则会由于不区分大小写而失败。