为什么不应该在 C++ 中使用 char 和其他 C 函数?

问题描述

有人可以就这个问题 Assigning a value to char* in a struct 的答案启发我吗?

在答案中,他们告诉提问者不要混合使用 C 和 C++,即如果是 C++,则使用 stringcin 要么 char 如果它是 C。这让我感到困惑,因为我知道我们可以通过包含适当的库在 C++ 中使用像 charprintf 等等。如果出于多种原因,我们应该在 C++ 项目中使用 char 怎么办?

其中一个答案还说 typedef struct{...}x; 在 C++ 中不是必需的,而到目前为止我知道它用于防止重新键入 struct x,例如 x Name1; x Name2; 而不是 { {1}}。对于像我这样的初学者来说,这已经足够令人困惑了。

解决方法

C 和 C++ 是不同的语言,无论它们看起来多么相似以及它们有什么共同的子集。作为不同的语言,它们的方法只能在该语言中使用。 当你知道自己在做什么时,混合它们是很好的。正如 the other answer 所述,char 数组比 std::string 更难使用,尽管它们有其优点。对于初学者来说,如果你想学习 C++,学习 std::string 与使用 char*

相比可以为你节省很多调试代码中发生的奇怪事情

您不需要 typedef struct {} X 的原因是 C 和 C++ 是不同语言的主要样本。每次在 C++ 中使用时都不需要重复 struct X,无论是否有 typedef。我什至会说这是有害的,因为 void foo(struct X*) 的作用不仅仅是 void foo(X*)。此外,C++ 中的 struct 等价于 class,唯一的区别是默认访问说明符(structpublic 作为默认,class 有 {{1 }}).

,

零终止字符 * 多年来,字符串一直是大量错误、崩溃和安全漏洞的根源,通常是因为有人忘记零终止它们,或者因为他们忘记了 4 个字符的字符串需要 5 个字符长,或许多其他场景。

它们可以安全使用,但经验告诉我们我们会犯错误,浪费时间和精力测试、检查和再次测试,当我们可以只使用一个字符串类,在一个地方包含所有检查,被测试在一个地方,再也不需要担心了。那么我们到底为什么不呢?

,

如果出于多种原因,我们应该在 C++ 项目中使用 char 怎么办?

没有什么能阻止你 :D

也就是说,std::cin 和 std::string 的设计就是这样,因为使用 char* 和 scanf 容易出错且效率低下(并且它们被添加到 C++ 标准库中以提供更好的方法).

在 C++ 中直接使用 char* 是有原因的,但大多数都是非常糟糕的原因(一个很好的理由是学习 - 例如)。

,

C++ 编译器并不关心你是否将 C 风格的代码与 C++ 风格的代码混合在一起,它会产生一些结果。

其他人关心你是否将 C 风格的代码与 C++ 风格的代码混合在一起,因为它真的很容易做一些与你认为应该做的细微不同的事情。

C++ 不是一种安全的语言,你根本就不能做错事,也不是一种更安全的语言,它会在你做错事时大声告诉你。这是一种不安全的语言,如果你做错了事,你可能直到最糟糕的时刻才注意到。

,

这是一个基于意见的问题(我想这就是它被否决的原因),所以我将在这里提出不同意见:

为什么在 C++ 中不应该使用 char 和其他 C 函数?

嗯,部分是因为有些人对编程应该是什么有严格的看法,他们喜欢试图将这些看法强加给你。 :-)

C 确实有许多不安全的方面,特别是按照现代标准。的确,C++ 有“更好”或至少不同的方式来处理一些事情,包括字符串、I/O 和内存分配。

但归根结底,编程语言是工具,正确使用它们始终是在按设计使用它们和完成工作之间取得平衡。

C++ 被设计为 C 的超集。(当然,现在不是,但意图仍然很明显。)一个 C++ 程序——Bjarne Stroustrup 练习的重点始终是让你这样做。

如果您选择在 C++ 程序中使用 C 特性,这可能是无知的、不好的或危险的事情,这可能是权宜之计且非常合适的事情。归根结底,这取决于它是否能够完成工作、是否可维护,以及它是否可以为您共享代码或与之协作的任何其他人所接受。

例如,我用 C 和 C++ 编写代码。虽然我明白 cout<< 是如何比 C 的 printf 是一种“更好”的输出方式,但我承认我仍然在 C++ 程序中大量使用 printf时间,因为它非常方便多了。尽管存在臭名昭著且无法克服的缺陷和问题,printf 一直是我最喜欢的 C 部分之一,我不愿意放弃它。

我并不是说您应该在 C++ 中使用 printf,或者您应该忽略 std::stringnew/delete 的所有各种好处,以及STL。 “在罗马时,像罗马人那样做”是一个很好的哲学,而且大多数时候,您应该在 C++ 中使用 C++ 习语。但是,如果您有充分的理由偶尔使用 C 习语,我不认为这有什么可耻的,而且我认为您不应该让任何人内疚地让您放弃它,因为他们认为它“不合适”。

[看到这个答案因其异端建议而被否决的激烈程度将会很有趣。 :-)]