用 C 語言開發一門編程語言 — 跨平臺的可移植性

目錄

前文列表

用 C 語言開發一門編程語言 — 交互式解析器l

實現跨平臺的可移植性

理想情況下,我希望我的代碼可以在任何操作系統上編譯並運行,即程序的可移植性(Portability)問題。在 C 語言中,可以使用預處理器來解決這個問題。

使用預處理器指令

預處理器(CPP)也是一個程序,它在真正編譯程序之前運行,所以稱之爲預處理或預編譯器。預處理器的應用場景之一就是檢測當前的代碼在哪個操作系統中運行,從而來產生與平臺相關的代碼。而這也正是我們做可移植性工作時所需要的。

這裏使用預處理器指令來判斷,如果程序運行在 Windows 上,則僞造一個 readline 和 add_history 函數;而在其他操作系統上運行則直接使用 GUN Readline 函數庫提供的函數。

#include <stdio.h>
#include <stdlib.h>

/*
 * 如果程序運行在 Windows 上,則僞造一個 readline 和 add_history 函數。
 */
#ifdef _WIN32
#include <string.h>

static char buffer[2048];

/* Fake readline function */
char *readline(char *prompt) {
    fputs(prompt, stdout);
    fgets(buffer, 2048, stdin);

    char *cpy = malloc(strlen(buffer ) + 1);

    strcpy(cpy, buffer);
    cpy[strlen(cpy) - 1] = '\0';

    return cpy;
}

/* Fake add_history function */
void add_history(char *unused) {}

#else

/*
 * 如果程序運行在 Linux 上,則直接引入 Readline 庫函數。
 */
#ifdef __linux__
#include <readline/readline.h>
#include <readline/history.h>
#endif

/*
 * 如果程序運行在 Linux 上,則直接引入 Readline 庫函數,不需要包含 history.h 頭文件。
 */
#ifdef __MACH__
#include <readline/readline.h>
#endif

#endif

int main(int argc, char *argv[]) {
    puts("Lispy Version 0.1");
    puts("Press Ctrl+c to Exit\n");

    while(1) {
        char *input = NULL;

        input = readline("lispy> ");
        add_history(input);

        printf("You're a %s\n", input);

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