【问题标题】:Assigning a function pointer with a forward-declared prototype in Nim在 Nim 中使用前向声明的原型分配函数指针
【发布时间】:2015-04-30 13:37:11
【问题描述】:

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

var wndClass : WNDCLASS;

wndClass.lpszClassName = CLASSNAME;
wndClass.lpfnWndProc   = WndProc;
wndClass.hInstance     = hInstance;

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

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT

我收到此错误:

Error: type mismatch: got (None) but expected 'WNDPROC'

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

编辑:

作为参考,以下代码在全局范围内工作:

proc Foo : int32;

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

echo bar;
echo baz();

proc Foo : int32 =
    return 4;

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

【问题讨论】:

  • 纯猜测:您尝试在顶级全局范围内还是在其他函数中使用WndProc?我的猜测是,前向声明仅适用于函数之间,即函数A 可以访问B,反之亦然,如果您前向声明其中之一。如果在顶级范围内分配函数需要完整的定义,这对我来说是有意义的。
  • @bluenote10:查看我的编辑
  • 我真的很想帮助你,但我根本无法重现你的问题。有一个完整的例子会有所帮助,包括WNDCLASSWNDPROC 的定义。甚至更好:您能找到一个显示您的问题的最小跨平台示例吗?
  • 可以将LRESULT 接受为WNDPROC 类型吗?
  • @bluenote 这些都是标准 Nim 发行版的一部分。 nim-lang.org/windows.html

标签: function-pointers forward-declaration nim-lang


【解决方案1】:

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

这段代码编译:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2012-03-08
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多