在C++中使用为C编写的Linux API头

Using Linux API headers made for C in C++

本文关键字:Linux API C++      更新时间:2023-10-16

让我们考虑一下这段代码:

#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.hstdio.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