【发布时间】: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++