C编程入门,绝对入门的快速入门

2020-12-17 20:06:37

!☕本教程将指导您使用C编程语言编写“ Hello World”程序。您将使用Unix风格的终端仿真器和命令行工具来执行命令,使用Linux风格的程序包管理器来安装程序和库,使用GNU nano文本编辑器来编写C代码,使用介子构建系统来构建可执行程序,并使用Gtk +库来编写可移植的跨平台程序。

提供了三种操作系统的说明:macOS,Ubuntu Linux和Windows。选择的工具是个人的最爱,并且都是手工挑选的,以便在三个操作系统上实现最快的开发并允许相同的开发流程(从而实现无缝的环境切换)。本教程中使用的所有工具都是免费的开源软件,可以毫无问题地下载和使用。不需要编程经验,因为本教程适合绝对的初学者。

对于绝对的初学者,有一些注意事项将使我们的道路更容易和更快地理解:为简短起见,本教程将仅指导设置过程,而不会教授C语言。最后将提供后续步骤的参考; someprogram下载可能很大,并且需要一些时间。

编程语言和文本命令与口头语言有很大不同:程序必须以非常严格的方式编写。缺少逗号,该程序将停止工作。对于初学者来说,最重要的规则是C语言像大多数其他编程语言一样,区分大小写,即大写字母与小写字母是不同的,并且一个不能互换。键入代码时应牢记这一点,如有疑问,请复制并粘贴以确保所有符号均正确书写。

我们将使用终端仿真器应用程序键入文本命令。我将简要说明每个命令的作用,并会显示在美元符号之后编写的每个命令。美元符号代表终端仿真器的提示符号,它是命令行输入程序(称为shell)在等待命令时显示的常用符号。例如:

在上面的示例中,我们在提示符号后键入:ls [space] [minus] l,然后按[enter]执行。在此示例中,我们使用-l参数(程序的特定参数,将输出模式更改为long或更具描述性)执行ls程序(列表目录)。相同的示例,但在我的计算机中也显示了结果输出:

因此,在使用-l参数运行ls程序后,它会显示当前目录的冗长描述,并在末尾显示另一个美元符号,等待新命令。不用担心理解此示例,我还将在最后添加参考,以了解有关使用Unix样式的命令行工具的更多信息。

每个操作系统需要不同的过程。选择最适合您的一个。安装后,编写和运行代码将以相同的方式进行。我们将编写可在所有三个系统上运行的单一跨平台程序,并使用相同的跨平台构建工具对其进行构建。

对于macOS,仅终端仿真器随操作系统一起安装。 Apple提供的C编译器是LLVM clang编译器,包含在“ Xcode命令行工具”包中。要安装它,请通过打开Spotlight搜索输入打开Terminal应用程序,然后键入Terminal(或在Applications内部的Utilities文件夹中找到它)。在终端仿真器中,键入:

Xcode安装程序将启动。按照将出现的说明进行操作,最后将安装LLVM clang C编译器。您可以使用--version参数执行它,以检查它是否正常工作:

要安装构建工具,文本编辑器和库之类的软件包,我们将安装Homebrew软件包管理器,它是macOS的主要Linux样式的软件包管理器。软件包管理器允许从命令行单命令安装,配置,升级和删除软件包。转到brew.sh并访问那里的说明,或简单地执行以下命令以下载并安装它:

请注意,此命令已经比以前的命令复杂,可以从Homebrew源代码存储库下载并执行安装脚本,并且可以提示命令行的功能和效率。不必担心试图了解它,我们正在完全安装Homebrew,以使其易于执行复杂的软件包安装。[编辑20201214:在安装brew之后,可能需要重新启动Terminal App并配置搜索路径才能使用它。如有疑问,请查阅“自制软件”文档。

现在已经安装了Homebrew,您可以使用brew install安装软件包,并通过brew search安装搜索软件包。使用以下命令搜索并安装GNU nano文本编辑器:

我们将使用Debian家族的Ubuntu Linux中提供的apt软件包管理器,但使用其他Linux发行版,例如yum,dnf,pacman等。将以几乎相同的方式工作。在Linux上,通常会预先安装GNU编译器集合,因此我们将使用它而不是clang,但是它们的工作方式相同。单击屏幕左上角的活动菜单并在搜索输入中写入终端(或单击在收藏夹栏中的终端图标上)。在终端仿真器中,编写:

Ubuntu Linux和大多数其他发行版需要切换到管理员(root)模式才能安装程序,因此我们使用sudo程序以root模式执行apt-get(如果未安装sudo,则也可以使用su程序)。输入密码并按照说明进行操作。最后,检查gcc:

$ yum search nano#用于RedHat Linux / CentOS $ sudo yum install nano#用于RedHat Linux / CentOS

对于Windows,我们将使用MSYS2工具箱,该工具箱提供了终端仿真器,pacman程序包管理器和一整套Unix风格的命令行工具。从www.msys2.org下载MSYS2安装程序,然后按照说明安装软件包。安装后,MSYS2将提供三套程序,只要打开终端仿真器就可以选择它们。它们分别称为MSYS2外壳,MINGW64外壳(发音为mingwee 64)和MINGW32外壳。 MINGW64shell是开发Windows程序的合适工具。 MSYS2适合管理MSYS2本身,而MINGW32是32位版本,不应该再使用。安装MSYS2后,有必要立即对其进行升级。打开MSYS2shell并键入:

按照说明进行操作,如果要求重新启动终端仿真器。在Windows上,我们将使用GNU编译器集合编译器(gcc):

安装后,要测试gcc,必须使用MINGW64 shell。如果您正在运行MSYS2shell来执行pacman,请打开另一个运行MINGW64 shell的终端,然后键入:

从现在开始,我们假设正在使用MINGW64 shell。请注意,pacman在MSYS2和MINGW64外壳上均正常运行。您可以使用pacman -S安装软件包,并使用pacman -Ss搜索软件包:

现在,让我们创建一个新的根目录来存储该项目和所有以后的代码:

上面的第一个命令创建一个名为code的新目录。如果已经存在,它将抱怨。如果您更喜欢其他名称,请更改名称。第二条命令将当前目录更改为代码目录(当前目录是在文件操作指定文件名而不指定其目录位置时使用的目录)。现在创建hello目录:

这将创建code / hello目录(代码目录中的hello子目录)并切换到该目录。现在,使用nano编辑器创建hello.c文件:

C源代码名称已附加.c扩展名,如hello.c中一样。这样,用户和自动化工具都将知道这是一个C程序。纳米文本编辑器将打开,您可以在其中键入程序。编写如下所示的第一个程序。请记住:编程语言非常严格,因此请准确键入。大写字母不同于小写字母,并且不能互换。

为了快速说明起见,第一行加载了stdio.h函数库,该库提供了printf()函数,该函数用于在终端上编写消息。 C程序总是包装在函数中。执行开始时调用的函数称为main()。函数(例如数学函数)可能返回值(例如结果),并且它们也可能接受输入参数(例如mathsum的两个数值),或者对于主函数,则接受命令行中给出的输入参数(例如-l在ls -l中)。 C要求我们事先声明输入和输出数据类型,因此启动hello程序的主函数接收零(无效)参数作为输入,并向执行该程序的外壳返回整数值(int)。花括号用于界定函数执行的指令,称为语句和语句按顺序执行。 C语言中的完整语句不能以换行符结尾。相反,我们在每个语句之后的语句结尾处放置一个分号。在这种情况下,有两个单行语句:一个调用第二个函数printf(),另一个退出主函数,完成程序并将整数零返回到外壳程序(返回0)。要编写的消息用双引号括起来,“#Hello,World!\ n"”。最后两个字符(\ n)不是垃圾,C编译器可以理解它们,以便在打印问候语后向终端发送换行命令(如[enter]键一样)。我们还使用缩进编写了函数的内容,其中的内容不是从文本的第一列开始,因为在编写语句之前添加了[tab]字符。这就是专业程序员的工作方式:大括号括起来的语句块可以嵌套,每个新的块都经过缩进,以使其与其他代码可以快速区分开。然后,代码结构在视觉上变得明显。

编写程序后,通过键入[ctrl] + o和[enter]保存文件,然后通过键入[ctrl] + x退出exitnano。您可以使用cat命令以保存文件的方式查看文件:

我将使用cc命令而不是gcc或clang,因为两者都创建了从cc到它们自己的符号链接,并且它们的行为是相同的。 cc命令使用给定的源代码文件名(在此情况下仅是hello.c)创建在-oparameter后立即给出的hello可执行文件(或Windows上的hello.exe)。如果出现与该程序有关的任何错误消息,请返回源代码,并检查是否键入了错误的内容。如有疑问,请复制并粘贴上面的代码。要执行该程序,请键入:

接下来,我们的第一个C程序!注意:与ls,cat,cc等命令不同(它们是在shell的目录搜索路径中预先配置的),以便能够执行hello,必须键入一个明确的目录。在这种情况下,hello文件位于当前目录中(当前目录始终可以使用单个点字符访问,而无需显式命名)。因此,要执行该命令,请在其目录路径之前添加:./ hello。

Warning: Can only detect less than 5000 characters

$ pkg-config --cflags --libs gtk + -3.0-I / usr / include / gtk-3.0 -I / usr / include / pango-1.0 -I / usr / include / glib-2.0 -I / usr / lib / glib-2.0 / include -I / usr / include / harfbuzz -I / usr / include / freetype2 -I / usr / include / libpng16 -I / usr / include / libmount -I / usr / include / blkid -I / usr /包括/ fribidi -I / usr / include / cairo -I / usr / include / pixman-1 -I / usr / include / gdk-pixbuf-2.0 -I / usr / include / gio-unix-2.0 -I / usr /包括/atk-1.0 -I / usr / include / at-spi2-atk / 2.0 -I / usr / include / dbus-1.0 -I / usr / lib / dbus-1.0 / include -I / usr / include / at- spi-2.0 -pthread -lgtk-3 -lgdk-3 -lz -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib- 2.0 $

如您所见,使用gtk进行构建需要大量额外的参数,它们全部构成一组目录搜索路径(以-I开头的参数)和一组描述库位置和相互依赖性的库名(以-l开头的参数)。现在,要么将所有这些参数添加到您的cccommand命令行中,要么使用backtick运算符将调用嵌入到pkg-config中:

我还在编译命令中添加了更多参数,这使Ccompiler对程序员可能犯的错误的容忍度降低了:‑可以进行额外的分析以在代码中查找警告,‑ Werror将所有警告转换为错误,从而迫使编译停止并停止。 ‑pedantic ‑std = c11使编译器的行为符合ISO C 2011标准,从而阻止了所用C语言方言的大多数非标准扩展(这可能会破坏代码的可移植性并将您锁定在特定的操作系统中)。

与往常一样,在键入时检查是否有任何错误以使它可以干净地编译。让我们运行程序:

然后你走了!我们有一个图形化的hello world程序,可以使用带有单个跨平台代码的外部库将其移植到三个操作系统中!实际上,由于gtk可以在许多类似Unix的操作系统上运行,因此它远远超过三个操作系统。

在我们开始使用外部库之后,您是否注意到命令行有多大? pkg-config返回的整个行非常庞大。想像一下

......