c++ - 从 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
,还是没有任何区别?
解决方案
根据评论,我想我可以非常果断地回答这个问题:这个函数的编写方式非常糟糕,以至于你假设从更改签名中获得的任何收益都完全无关紧要。
此外,提议的更改(从TCHAR*
到TCHAR**
)是语义上的。当然,它还涉及一种间接方式,但最重要的是,它允许您修改指针值,如果您只是填充预分配的缓冲区,这根本不是您需要或想要的。
此外,如果目标是填充预分配的缓冲区,则排除了函数本身的分配。事实上,一旦你完成了分配,你可以很容易地sFile
直接返回,避免复制。
如果这可行(例如,因为您在此调用之前分配了缓冲区,无论如何),那么合理的结论是放弃输出参数并简单地返回结果。
事实上,如果你使用标准容器,你也可以吃蛋糕;通过自定义用于返回容器的分配器,您可以使其使用您想要的内存,而无需使用外参数破解。不过,该解决方案有点超出此答案的范围。
推荐阅读
- oracle - Oracle DB 作为文件存储
- react-native - 无法在生产中打开我的应用程序 | DeepLink React Native | 反应导航 v5/v6
- javascript - 根据 id 动态设置 html 元素样式
- angular - 如何导出地图以在其他组件中重复使用?
- ios - 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:Flutter 中的“标准消息损坏”
- spring-kafka - spring kafka ConcurrentMessageListenerContainer consumerr中的线程名称约定
- react-native - 我怎样才能在 false 上设置模式可见?
- c++ - 我们可以使用 node.js 子进程从服务器运行 openGL 项目吗?
- google-analytics - 如何删除谷歌标签管理器容器?
- react-native - 键盘避免视图无法与模态一起正常工作