【发布时间】:2010-09-16 20:58: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 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++ function thread-safety return-type thread-specific-storage