【问题标题】:How are 2 different callback passing modes both working? [duplicate]两种不同的回调传递模式如何工作? [复制]
【发布时间】:2023-01-25 05:15:46
【问题描述】:

我在我们的代码中发现了一个错误,我们以两种不同的方式传递了具有相同签名的 2 个回调,但两者都是出现工作:

设置的回调函数签名为:
int _stdcall PCIe7KA_SetUserCallback (int Handle, PCIe7KA_USER_HANDLER Fcn);

PCIe7KA_USER_HANDLER 在哪里:
void _stdcall YourIsrName (int Handle, DWORD Pending);

我有 2 个具有相同签名的不同回调,它们作为不同句柄的回调传递(如果您好奇的话,句柄用于 PCIe 可寻址 FPGA 卡):
void __stdcall MultiplexerCardIsr(int iHandle, DWORD dwPending) {...}
void __stdcall AnalogIOCardIsr(int iHandle, DWORD dwPending) {...}

它们以下列方式通过:
PCIe7KA_SetUserCallback(card.handle, &MultiplexerCardIsr);
PCIe7KA_SetUserCallback(card.handle, AnalogIOCardIsr); // note the lack of referencing

这两个似乎不仅可以编译,而且可以按预期工作。我相信第一个是正确的,第二个是错误的,但为什么两者仍然有效?是否发生了一些隐式转换?

编译器是 Visual Studio 2017 上的 MSVC 19.16.27048。代码主要是(极其混乱、全局性、遗留)C++,但这是卡供应商提供的 C 兼容固件接口。

【问题讨论】:

  • TL; 骗子的 DR:函数的名称将隐式衰减为指向函数的指针。这就像数组隐式衰减到第一个元素的指针一样。

标签: c++ c visual-c++


【解决方案1】:

没有你所说的“参考”。有运营商&的地址。

PCIe7KA_SetUserCallback(card.handle, &MultiplexerCardIsr);
PCIe7KA_SetUserCallback(card.handle, AnalogIOCardIsr); // note the lack of referencing

这两个调用是等效的,因为用作参数表达式并按值传递的函数指示符被转换为指向函数的指针。

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多