我正在学习c++,我刚刚开始学习Qt的一些功能来编写GUI程序。我问了自己以下问题:

c++以前没有语法能够要求操作系统提供一个窗口或一种通过网络进行通信的方式(我承认我也不完全理解api),它是如何通过c++本身编写的库突然获得这些功能的?在我看来,这一切都是可怕的循环。你能在这些库中找到哪些c++指令?

我知道这个问题对一个有经验的软件开发人员来说似乎微不足道,但我已经研究了几个小时,没有找到任何直接的回答。这已经到了我无法理解Qt教程的地步,因为库的存在对我来说是不可理解的。


当前回答

c++是如何…突然通过库获得这些功能 用c++写的?

使用其他库并没有什么神奇的。库是可以调用的简单的大函数包。

假设你在写一个这样的函数

void addExclamation(std::string &str)
{
    str.push_back('!');
}

现在如果你包含这个文件,你可以写addex叹号(myVeryOwnString);。现在你可能会问,“c++是怎么突然有能力在字符串中添加感叹号的?”答案很简单:你写一个函数来做这件事,然后你调用它。

因此,要回答你关于c++如何通过c++编写的库获得绘制窗口的能力的问题,答案是相同的。其他人写函数来做这些,然后编译它们,并以库的形式提供给你。

其他问题回答了窗口绘图的实际工作方式,但你听起来对库的工作方式感到困惑,所以我想解决你问题中最基本的部分。

其他回答

创建窗口不需要特殊的语法。所需要的只是操作系统提供一个API来创建窗口。这样的API由c++提供语法的简单函数调用组成。

此外,C和c++是所谓的系统编程语言,能够访问任意指针(可能由硬件映射到某些设备)。此外,调用在程序集中定义的函数也相当简单,这允许处理器提供的全部操作。因此,使用C或c++和少量的汇编程序来编写操作系统本身是可能的。

还应该提到Qt是一个不好的例子,因为它使用所谓的元编译器来扩展c++的语法。然而,这与它调用操作系统提供的api来实际绘制或创建窗口的能力无关。

我认为你忽略了系统调用的概念。每个操作系统都提供了大量的资源和功能,您可以利用它们来做与操作系统相关的底层工作。即使当您调用常规的库函数时,它也可能在幕后进行系统调用。

系统调用是一种利用操作系统强大功能的低级方式,但使用起来可能复杂且麻烦,因此通常被“包装”在api中,这样您就不必直接处理它们。但实际上,几乎所有涉及O/S相关资源的操作都将使用系统调用,包括打印、网络和套接字等。

在windows的情况下,微软windows已经把它的GUI写进了内核,所以有一些系统调用来创建窗口,绘制图形等。在其他操作系统中,GUI可能不是内核的一部分,在这种情况下,据我所知,不会有任何与GUI相关的系统调用,您只能在更低的级别上使用任何可用的低级图形和输入相关调用。

计算机就像一个洋葱,它有很多很多层,从纯硬件的内核到最外层的应用层。每一层都将自己的一部分暴露给下一个外层,这样外层就可以使用内层的一些功能。

以Windows为例,操作系统为运行在Windows上的应用程序公开了所谓的WIN32 API。Qt库使用该API为使用Qt的应用程序提供自己的API。你使用Qt, Qt使用WIN32, WIN32使用较低级别的Windows操作系统,等等,直到它成为硬件中的电信号。

c++是如何…突然通过库获得这些功能 用c++写的?

使用其他库并没有什么神奇的。库是可以调用的简单的大函数包。

假设你在写一个这样的函数

void addExclamation(std::string &str)
{
    str.push_back('!');
}

现在如果你包含这个文件,你可以写addex叹号(myVeryOwnString);。现在你可能会问,“c++是怎么突然有能力在字符串中添加感叹号的?”答案很简单:你写一个函数来做这件事,然后你调用它。

因此,要回答你关于c++如何通过c++编写的库获得绘制窗口的能力的问题,答案是相同的。其他人写函数来做这些,然后编译它们,并以库的形式提供给你。

其他问题回答了窗口绘图的实际工作方式,但你听起来对库的工作方式感到困惑,所以我想解决你问题中最基本的部分。

我如何看待这个问题,这实际上是一个编译器的问题。

这样看,你用汇编写了一段代码(你可以用任何语言写),它把你新写的语言(你想把z++称为汇编)翻译成汇编,为了简单起见,让我们称它为编译器(它是编译器)。

现在你给了这个编译器一些基本的函数,这样你就可以写int,字符串,数组等等,实际上你给了它足够的能力,所以你可以用z++来写编译器本身。现在你有了一个用z++编写的z++编译器,非常简洁。

更酷的是,现在您可以使用编译器已有的功能为其添加功能,从而通过使用以前的功能扩展z++语言的新功能

举个例子,如果你写了足够多的代码来绘制任何颜色的像素,那么你可以使用z++扩展它来绘制任何你想要的东西。