关键词搜索

源码搜索 ×
×

用 C 语言开发一门编程语言 — 跨平台的可移植性

发布2023-02-27浏览3071次

详情内容

目录

前言

通过开发一门类 Lisp 的编程语言来理解编程语言的设计思想,本实践来自著名的《Build Your Own Lisp》。

  • 代码实现:https://github.com/JmilkFan/Lispy

前文列表

用 C 语言开发一门编程语言 — 交互式解析器

实现跨平台的可移植性

理想情况下,我希望我的代码可以在任何操作系统上编译并运行,即程序的可移植性(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) {}

/*
 * 如果程序运行在 Linux 上,则直接引入 Readline 库函数。
 */
#else

#ifdef __linux__  // Linux
#include <readline/readline.h>
#include <readline/history.h>
#endif


#ifdef __MACH__  // MAC
#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;
}

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载