允许在多大程度上将 C 和 C++ 结合起来

To what extent is it permissible to combine C and C++?

本文关键字:C++ 结合 起来 程度      更新时间:2023-10-16

我正在为类编写聊天服务器。我想使用 C 的网络协议,但我更习惯用 C++ 编程,尤其是在字符串操作方面。

据我了解,您可以将两者组合在一个文件中并编译C++只要存在正确的 #include,它仍然会接受 C 代码。

对此有什么限制?我应该注意什么?C 有什么特别的东西在 .cpp 文件中不起作用吗?

不要将两者合并到同一个文件中。编写编译为C++的 C 会导致 C 人对你大喊大叫,反之亦然。相反,创建一个小的 C 库,并让你的C++链接到它。然后,您唯一需要做的就是添加

#ifdef __cplusplus
extern "C" {
#endif

在 C 库的头文件的开头,以及

#ifdef __cplusplus
}
#endif

最后。

这很容易,也很漂亮:创建一个Makefile,因为你使用的是 gnu make,这真的很容易:

program: cstuff.o program.o

这样,运行make将发出以下命令:

cc -c cstuff.c 
g++ -c program.cpp
cc cstuff.o program.o -o program

因此,目录列表将包含 4 个文件:program.cpp cstuff.c cstuff.hMakefile

  • cstuff.h包含您所有的结构定义和函数原型,以及extern "C"的东西,
  • cstuff.c是不言而喻的,并且
  • program.cpp#include "cstuff.h"开头,可以调用头文件中列出的函数,并具有您喜欢的所有C++-ey 优点。

您应该能够 #include 和使用标准标头,包括 C++ 中的网络标头,而无需执行任何特殊操作。

C 和 C++ 之间存在一些差异,但您不太可能因此遇到任何问题。

一个区别是枚举。在 C 中,枚举只是一个 int。在C++中,枚举是实际类型。此代码是有效的 C,但C++无效。

enum sport {
    hockey,
    baseball,
    soccer,
    vollyball
};
enum sport s = 5;

用 g++ 编译它会得到

test.c:11:错误:从"int"到"sport"的转换无效

以下是有关混合 C 和 C++ 的更多信息。

通常,

当混合 C 和 C++ 时,一切都很好,毕竟后者继承自语法的前一部分。

可能最显着的区别是您必须显式转换动态分配的内存:

int *array = (int*) malloc(...)
这是因为在 C 中,

void*可以分配给任何类型的指针,而在 C++ 中并非如此,而在 C 中则不需要这样做。但是在C++中,您可以简单地避免malloc并直接使用new和delete。

无论如何,看看

这里,总结了许多差异,但它们大多只是轻微的差异。

C++基本上只是添加了 OOP 方法的 C 的更新版本。因此,将它们结合起来并不是一个真正的问题。无论如何,大多数编译器都支持两者,因此您可以即时组合它们。

所有带有"C 接口"的库都可以在C++代码中使用。在最坏的情况下,您必须添加extern "C" { ... }以指定所包含符号的"外部链接"是 la C 而不是 la C++。在最好的情况下,使用该库的标头已经考虑到了在代码中使用的可能性C++因此您所要做的就是包含它,然后像在 C 中一样使用该库的功能。

我相当确定,在您的情况下("net"/sockets 函数),包含标头并在要链接的标头之间添加库就足够了。(ADD)当然,在原型想要char *你不能传递字符串的地方,如果你将字符串保留为字符串对象C++你必须使用 c_str() ...