Python 十分好用但并非萬能,讓我們?cè)倭私庖幌聨追N別的編程語言,實(shí)際上 Python 號(hào)稱是“膠水語言”,能把不同語言編寫的程序粘合在一起——本篇介紹的是 C 語言,它經(jīng)歷了半個(gè)世紀(jì)的時(shí)間考驗(yàn),目前主要應(yīng)用于“底層開發(fā)”,各大操作系統(tǒng)的內(nèi)核都是以 C 語言編寫的,學(xué)習(xí) C 語言可令你更好地理解計(jì)算機(jī)的內(nèi)部運(yùn)行機(jī)制。而且,C 語言經(jīng)典的語法形式也被許多新興編程語言所沿用。

任何文本編輯器都可以編寫 C 語言程序,但還需要有個(gè)“編譯器”(Compiler)例如 GCC 來將其編譯為機(jī)器語言程序文件才能運(yùn)行。如果你用 Windows,推薦安裝開源編譯工具集 TDM-GCC http://tdm-gcc.tdragon.net/
- TDM-GCC 5.1.0 64位安裝包 http://sourceforge.net/projects/tdm-gcc/files/TDM-GCC%20Installer/tdm64-gcc-5.1.0-2.exe/download
- TDM-GCC 5.1.0 32位安裝包 http://sourceforge.net/projects/tdm-gcc/files/TDM-GCC%20Installer/tdm-gcc-5.1.0-3.exe/download
TDM-GCC 裝好后打開命令提示符輸入以下命令查看 GCC 編譯器版本,確認(rèn)可以正常運(yùn)行:
gcc --version
讓我們用 VSCode 作為 C 語言源代碼的編輯器,請(qǐng)?jiān)跀U(kuò)展面板搜索并安裝 C/C++ 插件,然后新建文件并命名為 hello.c:
#include <stdio.h>
int main(int arc, char const *argv[])
{
printf("Hello World!\n");
return 0;
}
這個(gè)測試用 C 語言源代碼的第一行是包含標(biāo)準(zhǔn)輸入輸出庫“頭文件”的預(yù)編譯指令(這種不算語句);接下來是定義作為程序入口的主函數(shù),名稱必須為 main,返回值要求為整數(shù)類型,可以傳入任意多個(gè)字符類型數(shù)組作為參數(shù)(注意任何標(biāo)識(shí)符都必須確定類型且不能改變);主函數(shù)體第一條語句用格式化打印函數(shù)輸出一行文本;第二條語句返回 0 值表示主函數(shù)正常退出——C 語言用花括號(hào)標(biāo)明層次結(jié)構(gòu),用分號(hào)表示語句結(jié)束,因此預(yù)編譯指令以外的代碼允許不分行地書寫。輸入代碼時(shí) VSCode 會(huì)自動(dòng)提示補(bǔ)全,還可以幫你規(guī)范格式,右擊選擇“格式化文件”即可)。
接下來點(diǎn)擊 VSCode 菜單欄上的“終端”選擇“新建終端”打開命令行模式,輸入命令編譯 hello.c 生成可執(zhí)行文件 hello.exe 然后運(yùn)行:
PS D:\Test\c> gcc hello.c -o hello
PS D:\Test\c> .\hello.exe
Hello World!
除了上述的可執(zhí)行文件,你也可以編譯生成“共享庫”文件,如同 stdio 庫那樣提供給其他程序使用——讓我們來做一個(gè)提供累加函數(shù)的共享庫,首先新建文件 mylib.h:
int accumulate(int);
這個(gè)頭文件中是函數(shù)原型的聲明語句,指定累加函數(shù)的參數(shù)與返回值類型,函數(shù)聲明之后即可調(diào)用,否則須在定義之后方可調(diào)用。接下來新建文件 mylib.c 包含 mylib.h 并定義累加函數(shù)(可以對(duì)照一下之前同樣實(shí)現(xiàn)累加的 Python 代碼):
#include "mylib.h"
int accumulate(int n)
{
int result = 0;
int i = 1;
while (i <= n)
{
result += i;
i++;
}
return result;
}
請(qǐng)注意包含自定義頭文件的 include 指令要用引號(hào)而非尖括號(hào),下面輸入命令生成共享庫文件 mylib.dll:
PS D:\Test\c> gcc mylib.c -shared -o mylib.dll
接下來新建文件 myapp.c 也包含 mylib.h 并調(diào)用累加函數(shù):
#include <stdio.h>
#include "mylib.h"
int main()
{
int n;
printf("計(jì)算1累加至n,請(qǐng)輸入n:");
scanf("%d", &n);
int result = accumulate(n);
printf("1累加至%d的結(jié)果是%d\n", n, result);
return 0;
}
最后編譯生成可執(zhí)行文件 myapp.exe 并運(yùn)行,注意要指定字符編碼為 Windows 默認(rèn)的 GBK 避免中文亂碼:
PS D:\Test\c> gcc myapp.c mylib.dll -fexec-charset=GBK -o myapp
PS D:\Test\c> .\myapp.exe
計(jì)算1累加至n,請(qǐng)輸入n:600
1累加至600的結(jié)果是180300
對(duì)于 Python 開發(fā)者來說,只需引入標(biāo)準(zhǔn)庫的 ctypes 模塊,就可以直接使用上面的共享庫,示例代碼如下:
import os
from ctypes import CDLL
cdll = CDLL(os.path.abspath("mylib.dll"))
result = cdll.accumulate(500)
print(result)
實(shí)際上官方 Python 解釋器就是 C 語言編寫的,許多 Python 第三方包也都在底層用 C 語言實(shí)現(xiàn)以保證運(yùn)行效率。如果你想深入學(xué)習(xí) C 語言,推薦再安裝一個(gè)專用集成開發(fā)環(huán)境例如免費(fèi)開源的 CodeBlocks http://www.codeblocks.org