2

我正在编写一个程序(嗯......使用来自 Tektronix 的示例代码)来测试通过网络到我们实验室的频谱分析仪的消息交换。

提供了一个名为“decl-32.h”的头文件,示例代码中包含以下行,以及它产生的错误:

ibwrt(GpibDevice, "SYSTem:ERRor:ALL?", strlen("SYSTem:ERRor:ALL?"));

“从 'const void*' 到 'PVOID {aka void*}' [-fpermissive] 的无效转换”

在头文件中,以下代码行被突出显示为错误,以及以下错误:

extern int __stdcall ibwrt (int ud, PVOID buf, long cnt);

“初始化 'int ibwrt(int, PVOID, long int)' [-fpermissive] 的参数 2”

问题是我不熟悉这种复杂的变量定义、使用和转换。

有人可以给我一些建议吗?我相信这与许多不熟悉此类变量类型和转换等的其他人有关。

先感谢您!

4

2 回答 2

2

to 的第二个参数ibwrt是. 在 C++ 中,指针类型可以隐式转换为,但与所有其他类型一样,不允许在转换中删除限定符。也就是说,从(类型字符串文字衰减到)到的转换是非法的。因此错误。PVOIDvoid*void*const char*void*

在 C 语言中,这是代码的来源,字符串文字会衰减char*,您的行将按原样编译。原因是历史原因 - C 的早期实现没有const关键字。

要修复它,您可以const使用const_cast

const char* s = "SYSTem:ERRor:ALL?";
ibwrt(GpibDevice, const_cast<char*>(s), strlen("SYSTem:ERRor:ALL?"));

您需要相信该函数不会尝试通过您传递给它的指针来修改字符串文字,否则它会调用未定义的行为。在这种情况下似乎是一个安全的假设(或者可能不是,参数名为buf,请注意!),但如果您想确定,请复制@MikeSeymour 在他的答案中显示的字符串。

于 2013-10-31T07:47:09.553 回答
1

问题是字符串文字是不可变的,并且这个函数需要一个const指向数据的非指针。

如果保证函数不会修改数据,而缺少const只是疏忽,那么您可以强制转换为所需的类型:

ibwrt(GpibDevice, const_cast<char*>("SYSTem:ERRor:ALL?"), strlen("SYSTem:ERRor:ALL?"));

如果它可能会修改数据,那么这将给出未定义的行为,并且您需要字符串的本地副本:

const char message[] = "SYSTem:ERRor:ALL?";
ibwrt(GpibDevice, message, strlen(message));

(您可以将长度指定为不太明显但可能更有效sizeof message - 1

于 2013-10-31T07:42:07.497 回答