【问题标题】:Returning strings from functions in C++从 C++ 中的函数返回字符串
【发布时间】:2021-05-12 04:24:16
【问题描述】:

我有一个函数:

BOOL ReadWebPage(CONST TCHAR *sURL, TCHAR *sDataRead)
{
BOOL rv = FALSE
TCHAR *sFile = new TCHAR[1024]();
StringCchCopy(sFile, 1024, L"c:\\temp\\file.txt");
res = URLDownloadToFileW(NULL, sURL, sFile, 0, NULL);
if (res != S_OK)
    StringCchCopy(sDataRead, 16, L"Error"); 
else {
    StringCchCopy(sDataRead, 16, L"File exists on remote server");
    rv = TRUE; }
delete[] sFile;
return rv;
}

如果是*sDataRead,那么调用行会这样调用这个函数:

ReadWebPage(L"http://www.example.com/test.txt", sTest);

如果是**sDataRead,那么调用行会这样调用这个函数:

ReadWebPage(L"https://www.example.com/test.txt", &sTest);

我的问题是,我应该在函数中为ReadWebPage 原样声明*sDataRead,还是将其声明为**sDataRead 更有效,还是没有任何区别?

【问题讨论】:

  • 如果你想从一个函数中返回一些东西,返回它通常是最好的方法。
  • BOOL ReadWebPage(CONST TCHAR *sURL, std::basic_string<TCHAR>& sDataRead) 怎么样?
  • @Someprogrammerdude 仍然没有从这个函数返回字符串。
  • 即使URLDownloadToFileW 调用成功,也不要忘记实际复制到sDataRead。并且可能在错误时返回FALSE
  • 我不想返回字符串,我想要函数的参数中的返回字符串。

标签: c++ parameter-passing wchar-t


【解决方案1】:

基于 cmets,我想我可以非常果断地回答这个问题:这个函数的编写方式非常糟糕,以至于你可能从更改签名中获得的任何收益都完全无关紧要。

此外,提议的更改(从TCHAR*TCHAR**)是语义上的更改。当然,它还涉及一种间接方式,但最重要的是,它允许您修改指针值,如果您只是填充预分配的缓冲区,这根本不是您需要或想要的。

此外,如果目标是填充预分配的缓冲区,则排除了函数本身的分配。事实上,一旦你完成了分配,你可以很容易地直接返回sFile,避免复制。

如果这可行(例如,因为您在此调用之前分配了缓冲区,无论如何),那么合理的结论是放弃输出参数并简单地返回结果。

事实上,如果你使用标准容器,你也可以吃蛋糕;通过自定义用于返回容器的分配器,您可以使其使用您想要的内存,而无需使用外参数破解。不过,这个解决方案有点超出这个答案的范围。

【讨论】:

  • 自定义分配器不是一个应该轻易提出的建议,尤其是当问题是像这样的标准类别之一时。有比这更简单的现成解决方案。
  • @j6t 因此我只是提到而不是建议将其作为首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 2018-06-22
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多