我目前正在检查 DLL 到一种非常特殊的测量设备,该设备称为“测力板”,由 Advanced Mechanical Technology, Inc. 生产。它测量人体站立或移动时产生的地面反作用力。这个 DLL 是用 Visual C++ 编写的(如程序员参考所说)并由测力台制造商提供。
所以,有一个函数叫做
fmDLLTransferFloatData
。在 DLL 的头文件中是这样声明的:
int DLLExport fmDLLTransferFloatData(float *&data);
它返回一个
int
并需要引用一个指向 float
数据的指针。到目前为止,一切都很好。这是这个函数的奇怪部分,根据程序员参考,它必须在代码中使用的方式:
float *ptr;
int ret;
//getting the Data
ret = fmDLLTransferFloatData((float *&)ptr);
看看参数语法:
((float *&)ptr)
。它有效。有人能解释一下这个句法到底是什么意思吗?
所以,正如我已经说过的,这个函数工作正常,如果有人向我解释这个奇怪的语法,我实际上会非常高兴。
它对您显示的上下文完全没有任何作用。如果
ptr
是 float*
类型的变量,那么表达式 ptr
和 (float *&)ptr
是 100% 完全等价的。
所以你可以只写
ptr
。
事实上,使用 C 风格的转换
(float *&)
是一种不好的做法,因为它很容易导致严重的问题被忽视。无论ptr
是什么类型,转换几乎总是会成功,但如果它实际上不是float*
,那么它几乎肯定会导致未定义的行为。然而,编译器不会将此诊断为错误或警告,因为显式强制转换本质上告诉编译器只做它而不会抱怨,无论它有多危险。