`CString`是什么?

28

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

有些人会这样写

char a_c_string [];

当别人使用某些方式的时候

CString another_c_string;

有区别吗?我在CStrings上找到的所有参考资料都像我在第一个示例中声明的那样,只有在论坛等地方看到过人们举例说明时才会采用另一种方式。


2
CString是微软的一个可恶之处,不是吗? - Paul R
3
CString在我使用过的任何语言中都不存在。它是从哪里来的?请从C或C++中选择一个(然后标记为此),然后告诉我们CString所在的语言(然后标记为此)。 - Lightness Races in Orbit
4
@Non-StopTimeTravel CString 是 MFC 中的概念。 - acraig5075
5
如果微软能在文档中更清晰地表明这一事实,那就太好了。他们有一个让C++和“他们想要的C++”之间的界限变得模糊的恶习。 - Lightness Races in Orbit
3
@EmilioGaravaglia:无关紧要。现在已经有文档了,并且已经有20年的时间来澄清什么是标准,什么不是标准。 - Lightness Races in Orbit
显示剩余3条评论
3个回答

46

CString既不是C类型也不是C++类型。它似乎是Microsoft发明的,本质上是std::string的一个替代品:

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

我建议忽略它,以便:

(a) 人们知道你在说什么; (b) 你的代码是可移植的; (c) 你正在编写符合全球公认的ISO C++标准的C++代码,许多人为此花费了很多时间进行争论(你知道的,与一个公司办公室里的几个人相比)。

这仅在您使用 Microsoft Visual C++ 进行编程时才可用,这极大地限制了其使用范围。


2
从好的方面来看,std::string 可以做到所有这些事情,除了转换为 const char */LPCSTLSKJ,对于这种情况,你只需要调用 my_str.c_str() - Potatoswatter
3
@Potatoswatter:这实际上是一件好事,它没有隐式转换。然而,微软决定打破这个规则也不足为奇;这是他们的惯常做法,不是吗? - Lightness Races in Orbit
由于我只运行Linux,无法访问Visual C++,所以对我来说没有什么用处,但是在研究C/C++中的字符串处理和使用cstring vs string对象的优点时,我在很多代码示例中看到了它。谢谢您的回复。 - user1768079
6
这并不仅仅是看起来像,它确实是微软公司发明的一种MFC库的一部分,早在C++标准建立之前就已经被创造出来了,用于封装Win16和32个API。它依然存在至今,因为它被授权映射操作系统API(不像std::string,它使用CRT进行自身功能)。虽然现在可能没有这方面的需求,但那些不打算跨平台的程序仍然从中受益。 - Emilio Garavaglia
3
@EmilioGaravaglia:“is”导致“似乎是”,这是简单的因果关系。 :) 您会发现,我选择的措辞是基于我自己对MFC不太熟悉,而不是暗示CString只存在一半! - Lightness Races in Orbit

29
许多GUI框架都有自己的字符串类。例如,QT有QString,wxWindows有wxString。在这种情况下,MFC有CString(还有其他方便的容器,如CArray、CList、CMap等)。因此,在MFC GUI代码的上下文中使用CString是方便且合理的,因为您已经严重依赖于Visual C++,并且不会考虑代码可移植性。我会小心地对待那些说要忽略它因为它是非标准的总体陈述 - 这完全取决于上下文。

2
我非常确定 "CString" 中的 "C" 代表 "Class"。 - Uwe Keim

15

只是以防引起混淆: "CString"中的"C"只是来自MFC的所有类的前缀。MFC是微软的C++库,封装了win32 API。该字符串类与"C字符串"几乎没有关系,后者用于描述C语言提供的字符串处理功能。 C语言仅提供对指向表示字符串的char数组的指针进行操作的字符串处理函数,并且它们要求最后一个字符为NUL(也称为NUL终止或零终止)。请注意,C++本身也有一个字符串类std::string(实际上还有std::wstring,两者都是std::basic_string模板的特化,但作为初学者,您可以安全地忽略这些)。


1
是的,这一点很重要,CString和"C-string"非常令人困惑。更令人困惑的是,因为std::string::c_str()返回"C-string",但它可以被分配给CString(而std::string则不行)。 - starriet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接