Python 與 C 語言

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.jpg

任何文本編輯器都可以編寫 C 語言程序,但還需要有個(gè)“編譯器”(Compiler)例如 GCC 來將其編譯為機(jī)器語言程序文件才能運(yùn)行。如果你用 Windows,推薦安裝開源編譯工具集 TDM-GCC http://tdm-gcc.tdragon.net/

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)載】C&C++——C函數(shù)與C++函數(shù)相互調(diào)用問題 C C++相互調(diào)用 在項(xiàng)目中融合C和C++有時(shí)是不可避免的,...
    天之道天知道閱讀 3,586評(píng)論 2 19
  • 動(dòng)態(tài)鏈接,在可執(zhí)行文件裝載時(shí)或運(yùn)行時(shí),由操作系統(tǒng)的裝載程序加載庫。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,778評(píng)論 0 3
  • 第一章:編譯和安裝SCons第二章:簡單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫文件第五章:節(jié)點(diǎn)對(duì)象第六...
    仙靈兒閱讀 12,345評(píng)論 0 3
  • 文/清音 電閃,雷鳴,狂刮的風(fēng),烏壓壓的云,暴風(fēng)雨就要來臨。村西邊那片社林地的小道上,急急忙忙走著母女倆。林地里望...
    琵琶清音閱讀 530評(píng)論 0 0
  • 有你的遠(yuǎn)方 溫暖明亮 沒有你的此地 寒冷凄涼 葉落有形無聲 相思有聲無形 從此你身旁的一草一木 都是我羨慕的對(duì)象 ...
    余子歡閱讀 272評(píng)論 5 3

友情鏈接更多精彩內(nèi)容