gpt4 book ai didi

c++ - 是否可以*安全地*从函数返回 TCHAR*?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:07 26 4
gpt4 key购买 nike

我创建了一个将所有事件通知代码转换为字符串的函数。真的很简单。

我有一堆常量,比如

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 .它不会破坏任何现代计算机的性能。

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

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

关于c++ - 是否可以*安全地*从函数返回 TCHAR*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com