c语言如何实现全部参数加9,怎样处理C语言VC8/9中的CRT函数对于非法参数呢?

作为一名开发人员,相信大家都应该知道什么叫做CRT函数吧。一般来说,CRT函数就是标准的C语言函数。例如,printf、scanf、strlen、fopen等函数就属于CRT函数。好了,今天小编要为大家带来的教程就是:怎样处理C语言VC8/9中的CRT函数对于非法参数呢?

其实在VC8/9中,有很多的CRT函数会进行检查一下所传入参数的合法性。万一当CRT函数在检测的时候,突然检测到一个非法参数传入的时候,那么它就会开始调用“非法参数处理例程”了。何为非法参数呢?简单来说,就是参数的不合法性。其实默认的“非法参数处理例程”主要的原理就是调用WatsonCrashReporting,它可以让应用程序崩溃,并且还可以询问大家是否愿意发送应用程序崩溃的数据转储给Microsoft进行相对应的分析。在debug模式(即调试模式)下,非法参数还可能会产生失败的断言。

562270ff38c92161ba81d98d90889546.png

如果大家想要设置自定义处理例程,可以通过以下这种方法来实现:调用_set_invalid_parameter_handler,来代替默认的处理例程。假如说大家所指定的处理例程并没有终止应用程序,那么在这个处理例程返回以后,这个CTR函数就会重新获得控制权。这个时候,你会发现这些CTR函数一般都会停止执行,并且还会返回一个错误代码,并且设置errno。但是在大多数的情况下,返回值以及errno值两者都是EINVAL,来指示一个非法参数。在某一些情况下,它还会返回一个更加详细的错误代码。

函数原型:

现在小编先给大家见识一下_set_invalid_parameter_handler的函数原型吧,具体的编程代码如图所示:

30cabdfe8ca33bbbb14979347583a9f6.png

在这个函数原型中,它是使用pNew参数来进行指定的处理例程代替现在有的处理例程,并且还会返回被代替的处理例程。

接下来,小编还要给大家见识一下不合法的参数处理例程类型_invalid_parameter_handler,它的函数原型如图所示:

457763019ad34d82faa05019fc1c17ba.png

在这个函数原型中,大家可以看到它分别有五个参数,每一个参数都分别代表着不同的含义。那么每个参数的含义是什么呢?现在小编就为大家一一讲述。首先第一个参数表示的是参数表达式,第二个参数表示的是现非法参数的CRT函数名,第三个参数表示的是CRT源代码的文件名字,第四个参数表示的是代码行,然而最后一个参数表示的是保留值。假如说我们使用的是非Debug版CRT库,那么全部的这些参数值通通都会为NULL值。

示范例子:

接着我们再来引用一下MSDN上的例子,具体的例子代码如图所示:

d92ad3e6addf3e918da000b5c3b400d6.png

通过以上的编程代码,大家会知道运行结果(VC9SP1)是怎样的吗?大家可以看一下最终的出来的结果。如下:

Invalidparameterdetectedinfunctionprintf.File:f:\\dd\\vctools\\crt_bld\\self_x86\\crt\\src\\printf.cLine:54Expression:(format!=NULL)

温馨提示:

关于刚刚演示的例子,小编还要向大家说明一点。那就是在示范例子中,我们调用了_CrtSetReportMode(_CRT_ASSERT,0)来进行关闭Debug版CRT函数对于非法参数的ASSERT报告。但是在实际情况中,CRT库中其它一些特性的关闭以及开启在Debug版下通通都需要我们关闭ASSERT报告才可以体现出来。为了便于大家理解,小编找个例子来说明一下吧。

就比如说,假如我们要让CheckedIterator越界发生的时候将异常抛出,那么我们就可以设置宏_SECURE_SCL_THROWS的值为1。然而,假如Debug版不关闭ASSERT的话,那么就会在抛出异常之前CRT首先使用ASSERT报告越界,这样子的话就会隐藏了抛出的异常(当然啦,假如大家在弹出的断言失败对话框中选择“忽略”的选项以后,我们依然还是可以捕获到异常的,所以大家可以绝对的放心)。

小编结语:

大家通过这篇编程语言教程可以看到,小编主要是为你介绍怎样处理C语言VC8/9中的CRT函数对于非法参数,是不是非常的简单易学?欢迎大家来到课课家教育,在这里我们会给大家整理出很多的精彩内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值