允许在多大程度上将 C 和 C++ 结合起来
To what extent is it permissible to combine C and C++?
我正在为类编写聊天服务器。我想使用 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.h
和 Makefile
。
-
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() ...
- 多态性和功能结合
- 将 Vulkan 与 SFML 结合使用?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 如何将增强MSM与增强信号结合使用?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- C++ 将函数指针与最佳性能相结合
- 将 Lua 与 C++ DLL 结合使用
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 将2个欧拉角与GLM相结合的问题
- 结合std::execution和OpenMP是否可取
- 抽象和派生与std::list相结合
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用
- 可变参数模板与默认模板参数相结合
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 是否可以将C++与任何语言相结合?