目录

文章目录

  • 目录
  • 前文列表
  • 实现跨平台的可移植性
    • 使用预处理器指令

前文列表

《用 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#endifint 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;
}

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

  1. 用 C 语言开发一门编程语言 — 字符串与文件加载

    目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...

  2. 用 C 语言开发一门编程语言 — 条件分支

    目录 文章目录 目录 前文列表 条件分支 排序函数 等于函数 if 函数 递归函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C 语言开发一门编程语 ...

  3. 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计

    目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...

  4. 用 C 语言开发一门编程语言 — 变量元素设计

    目录 文章目录 目录 前文列表 变量 变量语法规则 变量的读取和存储 将变量加入 Lisp Value 体系 变量的计算 变量的定义与赋值 异常处理优化 源代码 前文列表 <用 C 语言开发一门 ...

  5. 用 C 语言开发一门编程语言 — Q-表达式

    目录 文章目录 目录 前文列表 Q-表达式 读取并存储输入 实现 Q-Expression 语法解析器 读取 Q-Expression 实现 Q-Expression 的函数 Head & T ...

  6. 用 C 语言开发一门编程语言 — S-表达式

    目录 文章目录 目录 前文列表 使用 S-表达式进行重构 读取并存储输入 实现 S-Expression 语法解析器 实现 S-Expression 存储器 实现 lval 变量的构造函数 实现 lv ...

  7. 用 C 语言开发一门编程语言 — 异常处理

    目录 文章目录 目录 前文列表 异常捕获 定义 Lisp Value 函数 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> <用 C 语言开发一门编程语言 - 跨平台 ...

  8. 用 C 语言开发一门编程语言 — 抽象语法树

    目录 文章目录 目录 前文列表 抽象语法树的结构 使用递归来遍历树结构 实现求值计算 抽象语法树与行为树 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器l> <用 C 语 ...

  9. 用 C 语言开发一门编程语言 — 语法解析器

    目录 文章目录 目录 前文列表 编程语言的本质 词法分析 语法分析 使用 MPC 解析器组合库 安装 快速入门 实现波兰表达式的语法解析 波兰表达式 正则表达式 代码实现 前文列表 <用 C 语 ...

最新文章

  1. 整合初步---------SSH(注解版)
  2. python浪漫代码-python七夕浪漫表白源码
  3. 【CyberSecurityLearning 61】文件上传
  4. bow 折叠键盘 linux,bow便携折叠蓝牙键盘体验
  5. C++ 面向对象程序三大特性之 多态
  6. 层次聚类分析代码_4个步骤,用聚类分析法实现用户分析!
  7. python基础教程是什么-python基础教程都有什么?
  8. 【POJ 3074】Sudoku【剪枝】
  9. uniapp 微信小程序的弹框文字换行
  10. O形橡胶密封圈设计标准
  11. python导入模块不存在_基于pycharm导入模块显示不存在的解决方法
  12. nacos启动后CPU使用率过高
  13. 项目方案及推进项目的基本流程思路
  14. True Liars (并查集压缩路径 + DP)
  15. MIUI12或android11找不到QQ文件的问题
  16. Trade strategy交易策略
  17. 08. 路由器的基本配置和Talent配置
  18. 数字化转型 财务部首当其冲
  19. 记录一次Oracle自动化测试工具 - OATS实战分享
  20. 华为校招前端开发一面

热门文章

  1. 初识html语言,初识 “HTML”
  2. vmboxcentos安装重启又要安装_Windows 10八月更新再遇尴尬:安装失败 或安装后随机重启...
  3. python实现高校教务管理系统_python+mysql实现教务管理系统
  4. c++读取json文件_SPARK入门 - json文件读取
  5. java task多线程_JAVA语言-多线程实现的四种方式
  6. Deepmind“好奇心”强化学习新突破!改变奖励机制,让智能体不再“兜圈子”
  7. 在docker中构建普通java程序_Docker入门-构建第一个Java程序
  8. [CES 2018] 联想公布全球首款Daydream一体机,第二季度或将发售
  9. 亚洲游戏行业遭遇史上最大DDoS攻击,微软:我给扛下来了
  10. 依图超车争夺AI创业第一股!冲刺科创板,募资75亿为造芯,去年营收91%投向研发...