微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么允许这些程序传递非常量变量而我不能?

如何解决为什么允许这些程序传递非常量变量而我不能?

我一直在尝试使用 portaudio 用 C++ 编写程序,尝试制作一个简单的音频应用程序,可以录制和播放音频只是为了学习。所以我有一个类,在这个类中,我初始化了一个变量 PaStreamParameters inputParameters。好的,稍后在代码中,我打开流以像任何其他程序一样使用 Pa_OpenStream,

err = Pa_OpenStream(
        &stream,&inputParameters,NULL,sampleRate,framesPerBuffer,paNoFlag,recordCallback,data);

而且我收到一个错误提示我进行了从 int (*)(const void*,const void*,long unsigned int,const PaStreamCallbackTimeInfo*,PaStreamCallbackFlags,void*)int (*)(const void*,void*,void*) 的无效转换;注意第二个参数,从 const void* 转换为 void*。这对我来说很有意义,实际上传递了一个非 const 变量,而 Pa_OpenStream 被编写为具有一个 const 输入。它甚至出现在文档中:http://www.portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a443ad16338191af364e3be988014cbbe。所以有什么问题?我在多个地方看到过,Pa_OpenStream 被传递了一个非常量参数。录制示例代码 http://portaudio.com/docs/v19-doxydocs/paex__record_8c_source.html 初始化 PaStreamParameters inputParameters,outputParameters;,改变它们,然后像​​我一样将其传递给 Pa_OpenStream。 Ardor 源代码,在 libs/backends/portaudio/portaudio_io.cc 中,open_callback_stream 函数初始化两个 PaStreamParameters 变量,都不是 const,并将它们传递给 Pa_OpenStream(以修改的方式,检查它是否应该传递NULL)。

这些代码如何工作,而我的不行?它们都没有将 const 输入和输出参数传递给 Pa_OpenStream 并且它们工作。他们如何不会得到从 const void*void* 的无效转换?

audour 源代码供参考:https://github.com/Ardour/ardour/blob/master/libs/backends/portaudio/portaudio_io.cc

解决方法

C++ 将非常量指针转换为常量指针没有问题,两者完全兼容,并且会自动进行转换。但这不是编译器在这里抱怨的。

它在抱怨指向回调函数 recordCallback 的指针。为函数声明的参数类型是该函数类型的一部分,它们必须完全匹配,否则类型不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。