C語言和Python不能說的祕密

前言

Python 十分好用但並非萬能,讓我們瞭解一下別的編程語言,——本篇介紹的是 C 語言

它經歷了半個世紀的時間考驗,目前主要應用於“底層開發”,各大操作系統的內核都是以 C 語言編寫的,學習 C 語言可令你更好地理解計算機的內部運行機制。而且,C 語言經典的語法形式也被許多新興編程語言所沿用。

【文章福利】:小編有自己的學習交流羣967051845!進羣可以免費領取C語言基礎到項目實戰資料

任何文本編輯器都可以編寫 C 語言程序,但還需要有個“編譯器”(Compiler)例如 GCC 來將其編譯爲機器語言程序文件才能運行。如果你用 Windows,推薦安裝開源編譯工具集 TDM-GCC

TDM-GCC 裝好後打開命令提示符輸入以下命令查看 GCC 編譯器版本,確認可以正常運行:

gcc --version

我們用 VSCode 作爲 C 語言源代碼的編輯器,請在擴展面板搜索並安裝 C/C++ 插件,然後新建文件並命名爲 hello.c:

#include <stdio.h>

int main(int arc, char const *argv[])
{
    printf("Hello World!\n");
    return 0;
}

這個測試用 C 語言源代碼的第一行是包含標準輸入輸出庫“頭文件”的預編譯指令(這種不算語句);接下來是定義作爲程序入口的主函數,名稱必須爲 main,返回值要求爲整數類型,可以傳入任意多個字符類型數組作爲參數(注意任何標識符都必須確定類型且不能改變);主函數體第一條語句用格式化打印函數輸出一行文本;第二條語句返回 0 值表示主函數正常退出——C 語言用花括號標明層次結構,用分號表示語句結束,因此預編譯指令以外的代碼允許不分行地書寫。輸入代碼時 VSCode 會自動提示補全,還可以幫你規範格式,右擊選擇“格式化文件”即可)。

接下來點擊 VSCode 菜單欄上的“終端”選擇“新建終端”打開命令行模式,輸入命令編譯 hello.c 生成可執行文件 hello.exe 然後運行:

PS D:\Test\c> gcc hello.c -o hello
PS D:\Test\c> .\hello.exe
Hello World!

除了上述的可執行文件,你也可以編譯生成“共享庫”文件,如同 stdio 庫那樣提供給其他程序使用——讓我們來做一個提供累加函數的共享庫,首先新建文件 mylib.h:

int accumulate(int);

這個頭文件中是函數原型的聲明語句,指定累加函數的參數與返回值類型,函數聲明之後即可調用,否則須在定義之後方可調用。接下來新建文件 mylib.c 包含 mylib.h 並定義累加函數(可以對照一下之前同樣實現累加的 Python 代碼):

#include "mylib.h"

int accumulate(int n)
{
    int result = 0;
    int cnt = 1;
    while (cnt <= n)
    {
        result += cnt;
        cnt++;
    }
    return result;
}

請注意包含自定義頭文件的 include 指令要用引號而非尖括號,下面輸入命令生成共享庫文件 mylib.dll:

PS D:\Test\c> gcc mylib.c -shared -o mylib.dll

接下來新建文件 myapp.c 也包含 mylib.h 並調用累加函數:

#include <stdio.h>
#include "mylib.h"

int main()
{
    int n;
    printf("計算1累加至n,請輸入n:");
    scanf("%d", &n);
    int result = accumulate(n);
    printf("1累加至%d的結果是%d\n", n, result);
    return 0;
}

最後編譯生成可執行文件 myapp.exe 並運行,注意要指定字符編碼爲 Windows 默認的 GBK 避免中文亂碼:

PS D:\Test\c> gcc myapp.c mylib.dll -fexec-charset=GBK -o myapp
PS D:\Test\c> .\myapp.exe
計算1累加至n,請輸入n:600
1累加至600的結果是180300

對於 Python 開發者來說,只需引入標準庫的 ctypes 模塊,就可以直接使用上面的共享庫,示例代碼如下:

import os
from ctypes import CDLL
cdll = CDLL(os.path.abspath("mylib.dll"))
result = cdll.accumulate(500)
print(result)

實際上官方 Python 解釋器就是 C 語言編寫的,許多 Python 第三方包也都在底層用 C 語言實現以保證運行效率。如果你想深入學習 C 語言,推薦再安裝一個專用集成開發環境例如免費開源的 CodeBlocks http://www.codeblocks.org

福利

需要C/C++資料的朋友,因爲平臺不能發送文件,可以添加小編的學習交流羣967051845,資料就在羣文件裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章