用 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] = ' ';

    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
");

    while(1) {
        char *input = NULL;

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

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

        free(input);
    }
    return 0;
}