0

我正在为课堂编写聊天服务器。我想使用 C 的网络协议,但我更喜欢用 C++ 编程,特别是在字符串操作方面。

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

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

4

5 回答 5

3

不要将两者结合在同一个文件中。编写编译为 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.hMakefile.

  • cstuff.h包含你所有的结构定义和函数原型,以及那些extern "C"东西,
  • cstuff.c是不言而喻的,并且
  • program.cpp开头#include "cstuff.h"可以调用头文件中列出的函数,并具有您喜欢的所有 C++ 优点。
于 2012-04-10T03:58:35.327 回答
1

您应该能够#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++ 的更多信息。

于 2012-04-11T01:53:39.753 回答
1

通常在混合 C 和 C++ 时一切都很好,毕竟后者继承自最初的大部分语法。

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

int *array = (int*) malloc(...)

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

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

于 2012-04-10T02:10:13.960 回答
0

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

于 2012-04-10T02:40:00.103 回答
0

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

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

于 2012-04-10T06:11:43.593 回答