什么是`CString`?

use*_*079 18 c++ string mfc

为什么我会看到一些使用CStrings不同声明的代码.

有些人使用这种格式

char a_c_string [];
Run Code Online (Sandbox Code Playgroud)

而其他人使用

CString another_c_string;
Run Code Online (Sandbox Code Playgroud)

有区别吗?我发现的所有引用都CStrings像我在第一个例子中所做的那样声明它,我只看到它在论坛上以其他方式完成,人们在这里举例说明.

Lig*_*ica 31

CString既不是C也不是C++类型.它似乎是微软的一项发明,基本上是一种替代方案std::string:

  • CString 对象可以由于连接操作而增长.
  • CString对象遵循"价值语义".将CString对象视为实际字符串,而不是指向字符串的指针.
  • 您可以自由地替换CString对象const char*LPCTSTR函数参数.
  • 转换运算符可以直接访问字符串的字符作为只读字符数组(C样式字符串).

我建议忽略它,这样:

(a)人们知道你在说什么;
(b)您的代码是便携式的;
(c)你正在编写C++,每个人都可以根据全球公认的ISO C++标准进行合理化,许多人花了很多很多时间来争论这个明确的目的(你知道,而不是一些人在在一家公司办公室的房间).

只有在使用Microsoft Visual C++进行编程时才能使用它,这实质上是有限的.

  • 它"似乎不是".它是一个MS发明,它是MFC库的一部分,甚至在C++标准建立之前就被发明用于包装Win16和32个API.它现在仍然存在,因为它被授予映射OS API(与std :: string不同,它使用CRT作为自己的函数).今天很可能没有必要,但是没有针对多平台的计划从中获得了一些优势. (5认同)
  • 从积极的方面来说,`std :: string`会做所有这些事情,除了转换为`const char*`/`LPCSTLSKJ`,你只需要调用`my_str.c_str()`. (2认同)
  • @Potatoswatter:[实际上这不是隐含的一件好事](http://stackoverflow.com/questions/492061/why-doesnt-stdstring-provide-implicit-conversion-to-char)。但是,微软决定打破这一约定并不奇怪。那是他们的MO,天生的。 (2认同)
  • @EmilioGaravaglia:通过简单的因果关系,“是”导致“似乎是”。:) 你会发现我的措辞是基于我自己对 MFC 的不熟悉而选择的,而不是暗示 `CString` 不知何故只存在一半! (2认同)

acr*_*075 23

许多GUI框架都有自己的字符串类.例如,QT有QString,wxWindows有wxString.在这种情况下,MFC具有CString.在MFC gui代码的上下文中使用CString是很方便和有意义的,因为那时你已经严重依赖Visual C++并且不会设想代码可移植性.我会小心一揽子声明说要忽略它,因为它是非标准的 - 这完全取决于上下文.

  • 我很确定“ CString”中的“ C”代表“ Class”。 (2认同)

Ulr*_*rdt 9

以防万一是造成混淆的原因:"CString"中的"C"只是MFC所有类的前缀.MFC是Microsoft包装win32 API的C++库.此字符串类与"C字符串"几乎没有关系,"C字符串"用于描述C语言提供的字符串处理功能.C语言仅提供字符串处理函数,该函数对指向字符串的char数组的指针进行操作,并且它们要求最后一个字符是NUL(也称为NUL终止或零终止).请注意,C++本身也有一个字符串类std::string(实际上还有std :: wstring和std :: basic_string模板,但作为初学者,你可以放心地忽略它们).