加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 是否可以*安全*从函数返回TCHAR *?

发布时间:2020-12-16 06:54:47 所属栏目:百科 来源:网络整理
导读:我创建了一个将所有事件通知代码转换为字符串的函数.非常简单的东西真的. 我有一堆像 const _bstr_t DIRECTSHOW_MSG_EC_ACTIVATE("A video window is being activated or deactivated.");const _bstr_t DIRECTSHOW_MSG_EC_BUFFERING_DATA("The graph is buff
我创建了一个将所有事件通知代码转换为字符串的函数.非常简单的东西真的.

我有一堆像

const _bstr_t DIRECTSHOW_MSG_EC_ACTIVATE("A video window is being activated or deactivated.");
const _bstr_t DIRECTSHOW_MSG_EC_BUFFERING_DATA("The graph is buffering data,or has stopped buffering data.");
const _bstr_t DIRECTSHOW_MSG_EC_BUILT("Send by the Video Control when a graph has been built. Not forwarded to applications.");
.... etc....

和我的功能

TCHAR* GetDirectShowMessageDisplayText( int messageNumber )
{
    switch( messageNumber )
    {
        case EC_ACTIVATE: return DIRECTSHOW_MSG_EC_ACTIVATE;
        case EC_BUFFERING_DATA: return DIRECTSHOW_MSG_EC_BUFFERING_DATA;
        case EC_BUILT: return DIRECTSHOW_MSG_EC_BUILT;
... etc ...

没什么大不了.我花了5分钟一起扔了.

…但我根本不相信我已经拥有了所有可能的值,因此如果找不到匹配项,我希望默认返回“意外通知代码(7410)”之类的内容.

不幸的是,无论如何我都无法想到返回一个有效的指针,而不强迫调用者删除字符串的内存……这不仅令人讨厌,而且还与其他返回值的简单性相冲突.

因此,如果不将返回值更改为用户传入缓冲区和字符串长度的参数,我无法想到任何方法.这将使我的功能看起来像

BOOL GetDirectShowMessageDisplayText( int messageNumber,TCHAR* outBuffer,int bufferLength )
{
    ... etc ...

我真的不想那样做.肯定有更好的办法.

在那儿?

经过10年的中断后我才回到C,所以如果这是显而易见的事情,请不要因为某种原因而忽视它.

解决方法

C ? std::string.它不会破坏任何现代计算机的性能.

但是,如果您需要对此进行过度优化,则有三种选择:

>使用您的示例所具有的缓冲区.>让用户之后删除字符串.像这样的许多API提供了自己的删除功能,用于删除每种动态分配的返回数据.>返回一个指向静态缓冲区的指针,每次调用时都会返回一个返回字符串.这确实有一些缺点,因为它不是线程安全的,并且它可能会令人困惑,因为返回的指针的值将在下次有人调用该函数时发生更改.如果非线程安全是可以接受的并且您记录了这些限制,那么它应该没问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读