OpenAL报错 ”error C4996: 'alutLoadWAVFile': 被声明为已否决“的问题原因及解决

本文主要是介绍OpenAL报错 ”error C4996: 'alutLoadWAVFile': 被声明为已否决“的问题原因及解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

备忘错误解决的过程,前人栽树,后人乘凉。

适合阅读:刚配置完OpenAL的新手
平台:VS2013,OpenAL
错误描述:error C4996: ‘alutLoadWAVFile’: 被声明为已否决

错误原因:

使用工具包ALUT的版本比较新,在新版本中以下三个函数已经弃用!
下面是错误过程分析,授人以渔。直接看解决跳至页尾。

//源代码在alut.h中
ALUT_API ALUT_ATTRIBUTE_DEPRECATED void ALUT_APIENTRY alutLoadWAVFile (ALbyte *fileName, ALenum *format, void **data, ALsizei *size, ALsizei *frequency, ALboolean *loop);
ALUT_API ALUT_ATTRIBUTE_DEPRECATED void ALUT_APIENTRY alutLoadWAVMemory (ALbyte *buffer, ALenum *format, void **data, ALsizei *size, ALsizei *frequency, ALboolean *loop);
#endif
ALUT_API ALUT_ATTRIBUTE_DEPRECATED void ALUT_APIENTRY alutUnloadWAV (ALenum format, ALvoid *data, ALsizei size, ALsizei frequency);

找错误过程说明:一开始以为是VS的问题,查了很多无果,最后F12进去看 alutLoadWAVFile 函数声明看到了前面的 ALUT_ATTRIBUTE_DEPRECATED 进一步F12进入看这个宏的定义如下:

//源代码在alut.h中
/* Flag deprecated functions if possible (VisualC++ .NET and GCC >= 3.1.1). */
#if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(MIDL_PASS)
#define ALUT_ATTRIBUTE_DEPRECATED __declspec(deprecated)
#elif defined(__GNUC__) &&  (__GNUC__ > 3 || (__GNUC__ == 3 && (__GNUC_MINOR__ > 1 || (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 1))))
#define ALUT_ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
#define ALUT_ATTRIBUTE_DEPRECATED
#endif

简单来说此宏是用于弃用接口的,当工具库中有更新,需要淘汰一些老旧的接口,可以使用此宏,此时调用这些旧接口,不同的编译器均会报警,这是为了兼容之前的库。对于VS2013,调节报警级别后仍然是报错,所以也没有细究VS的问题,从ALUT库入手解决。
其实写到这里,也想提醒看文章的朋友包括自己,这个问题如果在通读了ALUT的使用文档情况下是不会发生的,所以工欲善其事的道理,学习一个新的语言,新的库还是不能跳过基础的部分,否则有的错其实很简单很基础,但是不知道就是发现不了。

解决办法(有两种):

(1)修改alut.h(不推荐),把其中的弃用宏删去,如下所示:

//源代码
//=============================================================打开弃用
#else
ALUT_API /*ALUT_ATTRIBUTE_DEPRECATED*/ void ALUT_APIENTRY alutLoadWAVFile(ALbyte *fileName, ALenum *format, void **data, ALsizei *size, ALsizei *frequency, ALboolean *loop);
ALUT_API /*ALUT_ATTRIBUTE_DEPRECATED*/ void ALUT_APIENTRY alutLoadWAVMemory(ALbyte *buffer, ALenum *format, void **data, ALsizei *size, ALsizei *frequency, ALboolean *loop);
#endif
ALUT_API /*ALUT_ATTRIBUTE_DEPRECATED*/ void ALUT_APIENTRY alutUnloadWAV(ALenum format, ALvoid *data, ALsizei size, ALsizei frequency);
//==============================================================打开弃用

只是把中间弃用宏给注释了,然后上面的代码放在原来的位置,原来的注释掉,这样从大多数介绍OpenAL博客的文章中直接黏贴过来的代码基本可以运行,因为这些文章大多写的比较早,而且有些重复很多。但这种方法是违背ALUT的理念的,通过查看文档,有更好的方法。

(2)使用新的加载音源函数(推荐
其实ALUT中说的很明白,有一些新的用于加载音源的函数,比如这个:

ALuint alutCreateBufferFromFile (const char *filename);

函数说明:该函数尝试通过文件名来确定声音数据格式并将其加载到OpenAL的缓冲器中,返回一个指向包含加载的音源的缓冲器的句柄。也就是说此函数一次性做了如下三个工作。

alGenSources();//申请缓冲器
alutLoadWAVFile();//加载音源文件
alBufferData();//将音源放入缓冲器

ALUT做了很多类似的封装工作来方便我们操作OpenAL,具体的使用见另一篇文章。
至此,问题得以解决。

这篇关于OpenAL报错 ”error C4996: 'alutLoadWAVFile': 被声明为已否决“的问题原因及解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/517223

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock