首页 > 解决方案 > 从 C++ 中的函数返回字符串

问题描述

我有一个功能:

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,还是没有任何区别?

标签: c++parameter-passingwchar-t

解决方案


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

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

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

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

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


推荐阅读