在C++中使用为C编写的Linux API头
Using Linux API headers made for C in C++
让我们考虑一下这段代码:
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
using namespace std;
int main(void) {
char hi[14] = "Hello world!n";
if (write(1, hi, strlen(hi)) < 0) {
perror("write");
}
cout << "Done" << endl;
return 0;
}
在这里,我将混合各种C和C++代码来制作一些工作。我直接在stdout
上写,并使用一些C头,如string.h
和stdio.h
。这被认为是坏事吗?是否会出现未定义的行为?C代码是否与C++"兼容",所以我只包含它并使用它?
这个程序运行得很好。
Hello world!
Done
这被认为是坏事吗?
一些程序员认为,当有高级C++库函数可用时,使用C库函数是一种糟糕的风格。但是,在某些情况下,最好使用C库函数。
是否会出现未定义的行为?
可能不会。C++标准库包含了几乎整个C标准库(有一些小的更改),因此从C++调用C库函数是定义良好的。至于像write
这样的函数,它们的行为是由POSIX定义的。
C代码是否与C++"兼容",所以我只包含它并使用它?
对于标准的C库头,是的。对于实现标头,通常为yes;它们通常被设计为可以有效地包含在C++程序中。对于其他标头。。。大概并非所有的C代码都是有效的C++,但兼容性很高。
C++从C派生了很长一段时间,这两种语言已经独立进化。
C++标准描述了引入C++的故意不兼容性,这些不兼容性与它所衍生的C标准有关:http://eel.is/c++草稿/差异
人们犯的错误是认为这是一份完整的差异清单。C本身已经进化了,虽然C99的一些部分被纳入了C++的最新版本中,但并不是所有的都有(VLA、灵活的数组成员、复合文字…)
C11使差距变得更大,从删除get(仍包含在C++17中)到边界检查接口、线程支持和C++功能的C变体(如_静态断言关键字)。
因此,在大多数情况下,你可以在C++程序中使用旧的C-ish代码,一些会导致编译器错误的小更改,一些可能不会,以及近20年来你只能部分访问的C进步。
如果你真的想编写C类代码,可以考虑编写C代码,并利用该语言中可用的一整套语言改进。结果将是比你将自己限制在C++的C子集中所产生的垃圾代码质量高得多的代码。
Gala,
是的,这很好。C++是C的超集,您可以轻松地将两者混合。事实上,许多年长的程序员(像我一样)用C风格编写C++。在这种风格中,printf、strcpy、无模板、RogueWave而不是stl等与C++类一起使用。有时这被称为"带类的C"。
--Matt
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- Linux 蓝牙 API 功能位置
- 跨平台API开发Windows,Linux等
- 如何使用 Linux API for C 确定文件系统类型(名称)?
- JVM调用时可以找到Linux插座API
- Linux 中的性能数据收集 (API)
- SHGetKnownFolderPath等效于Linux中的API
- linux下的Deezer原生API:Unanble创建简单的应用程序
- 如何利用windows API将c++代码从windows自动转换为linux
- C 中的 Linux 无线 API C++.
- C++图形API带有一个小的学习曲线-linux
- 相当于 Windows API 中的 Linux 上的 lseek
- Unix 和 Linux API 标头是否与C++兼容
- POSIX 或 Linux API 函数,用于从路径获取文件扩展名
- Linux API列出正在运行的进程?——带着争论
- 如何在Linux api中使用wstring(s)
- 文件/运行时权限的Unix/Linux API
- 是否可以从Wine中运行的Windows应用程序调用本地Linux API
- c++是否不支持Linux API的某些部分?
- 在C++中使用为C编写的Linux API头