我正在为课堂编写聊天服务器。我想使用 C 的网络协议,但我更喜欢用 C++ 编程,特别是在字符串操作方面。
据我了解,您可以将两者组合在一个文件中并为 C++ 编译,只要存在正确的#include,它仍然会接受 C 代码。
这有什么限制?我应该注意什么?有什么特别来自 C 的东西在.cpp 文件中不起作用?
我正在为课堂编写聊天服务器。我想使用 C 的网络协议,但我更喜欢用 C++ 编程,特别是在字符串操作方面。
据我了解,您可以将两者组合在一个文件中并为 C++ 编译,只要存在正确的#include,它仍然会接受 C 代码。
这有什么限制?我应该注意什么?有什么特别来自 C 的东西在.cpp 文件中不起作用?
不要将两者结合在同一个文件中。编写编译为 C++ 的 C 会导致 C 人对你大喊大叫,反之亦然。相反,制作一个小的 C 库,并有你的 C++ 链接反对它。然后你唯一需要做的就是添加
#ifdef __cplusplus
extern "C" {
#endif
在 C lib 的头文件的开头,以及
#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.h
和Makefile
.
cstuff.h
包含你所有的结构定义和函数原型,以及那些extern "C"
东西,cstuff.c
是不言而喻的,并且program.cpp
开头#include "cstuff.h"
可以调用头文件中列出的函数,并具有您喜欢的所有 C++ 优点。您应该能够#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”的无效转换</p>
这是有关混合 C 和 C++ 的更多信息。
通常在混合 C 和 C++ 时一切都很好,毕竟后者继承自最初的大部分语法。
可能最显着的区别是您必须显式转换动态分配的内存:
int *array = (int*) malloc(...)
这是因为在 Cvoid*
中可以分配给任何类型的指针,而在 C++ 中并非如此,而在 C 中则不需要这样做。但在 C++ 中,您可以简单地避免 malloc 并直接使用 new 和 delete。
C++ 基本上只是添加了 OOP 方法的 C 的更新版本。因此,将它们结合起来并不是真正的问题。大多数编译器都支持两者,因此您可以即时组合它们。
所有带有“C 接口”的库都可以在 C++ 代码中使用。在最坏的情况下,您必须添加extern "C" { ... }
以指定封闭符号的“外部链接”是 la C 而不是 la C++。在最好的情况下,使用该库的标头已经考虑到在 C++ 代码中使用的可能性,因此您所要做的就是包含它,然后像在 C 中一样使用该库的函数。
我很确定在您的情况下(“net”/sockets 函数)包含标题并在要链接的标题之间添加库就足够了。(添加)当然,如果原型希望char *
您不能传递字符串,则必须使用 c_str() 如果您将字符串保留为 C++ 字符串对象...