许多Windows APIs会将指针指向一个缓冲区和一个size元素,但是结果需要放入一个c ++string中。 (我在这里使用windows unicode,所以他们是wstrings)
这是一个例子:
#include <iostream> #include <string> #include <vector> #include <windows.h> using namespace std; // This is the method I'm interested in improving ... wstring getComputerName() { vector<wchar_t> buffer; buffer.resize(MAX_COmpuTERNAME_LENGTH+1); DWORD size = MAX_COmpuTERNAME_LENGTH; GetComputerNameW(&buffer[0],&size); return wstring(&buffer[0],size); } int main() { wcout << getComputerName() << "n"; }
我的问题确实是,这是编写getComputerName函数的最好方法,以便更好地适合C ++,还是有更好的方法? 我没有看到任何方式直接使用string,而不通过一个载体,除非我错过了什么? 它工作正常,但不知何故似乎有点难看。 问题不在于特定的API,而只是一个简单的例子。
Mercurial预先提交挂钩:如何挂钩到当前目录中的python程序?
Windows 7 – 右键单击Python的上下文级联菜单
在C#中我的程序注销部分错误,我可以得到一些帮助吗?
C#属性:飞行中的字体和颜色更改
无法复制Java中的“我的文档”
获取Windows上给定path的可用磁盘空间
如何有效地检查,如果一个path是C#中的另一个path的孩子?
我怎样才能改变驱动器使用Python的操作系统?
尝试使用任务计划程序(Win7)注册任务时出错
在这种情况下,我不明白std :: vector是怎么给队伍带来的。 MAX_COmpuTERNAME_LENGTH不可能是非常大的,所以我简单地使用一个C风格的数组作为临时缓冲区。
看到这个答案的另一个问题。 它提供了一个StringBuffer类来处理这种情况非常干净。
我会说,因为你已经在更抽象的C ++接口背后抽象Windows API的任务,所以完全不要使用vector,也不要担心wstring的构造函数:
wstring getComputerName() { wchar_t name[MAX_COmpuTERNAME_LENGTH + 1]; DWORD size = MAX_COmpuTERNAME_LENGTH; GetComputerNameW(name,&size); return name; }
我会使用矢量。 为了回应你说你选了一个不好的例子,假装我们没有一个合理的恒定的字符串长度上限。 然后它不是那么容易:
#include <string> #include <vector> #include <windows.h> using std::wstring; using std::vector; wstring getComputerName() { DWORD size = 1; // or a bigger number if you like vector<wchar_t> buffer(size); while ((GetComputerNameW(&buffer[0],&size) == 0)) { if (GetLastError() != ERROR_BUFFER_OVERFLOW) aargh(); // handle error buffer.resize(++size); }; return wstring(&buffer[0],size); }
在实践中,你可以逃避写入字符串,但我不完全确定。 你当然需要通过你的std::wstring实现来做出额外的保证,超出了标准的范围,但是我希望MSVC的字符串可能是正确的。
我认为,如果wstring::reference是wchar_t&那么你是排序。 21.3.4定义non-const operator[]返回一个reference ,并返回data()[pos] 。 所以如果reference只是一个普通的wchar_t&那么通过引用就没有令人兴奋的写时复制行为的空间,而实际上字符串必须通过指针&buffer[0]来修改。 我认为。 这里的基本问题是标准允许实现更多的灵活性,而不是需要的。
尽管如此,为了避免复制一个字符串,这是一个很大的努力和评论,所以我从来没有觉得有必要避免一个中间数组/矢量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。