c – 是否可以*安全*从函数返回TCHAR *?
我创建了一个将所有事件通知代码转换为字符串的函数.非常简单的东西真的.
我有一堆像 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提供了自己的删除功能,用于删除每种动态分配的返回数据.>返回一个指向静态缓冲区的指针,每次调用时都会返回一个返回字符串.这确实有一些缺点,因为它不是线程安全的,并且它可能会令人困惑,因为返回的指针的值将在下次有人调用该函数时发生更改.如果非线程安全是可以接受的并且您记录了这些限制,那么它应该没问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |