zoukankan      html  css  js  c++  java
  • 用 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;
    }
    
  • 相关阅读:
    2-SAT模板
    AC自动机
    省选预备营-Day3(图论) 总结
    省选预备营-Day2(分治) 总结
    左偏树(可并堆)总结
    省选预备营-Day1(数据结构) 总结
    OI基础知识
    C++ 堆
    CH4601 普通平衡树
    java 函数形参传值和传引用的区别
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/12789708.html
Copyright © 2011-2022 走看看