用 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) {}
#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;
}
用 C 语言开发一门编程语言 — 跨平台的可移植性的更多相关文章
- Go语言开发环境安装
Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言. 去http://golang.org/doc/install#download 下载相应的版本. 1.安装go语言:2.将g ...
- Mac OSX下Go语言开发环境的搭建与配置--使用InteliJ IDEA 13
折腾了一上午终于把go语言的ide配置好了. 其实GO语言的语法和特性早在去年的时候就学习了一遍.结果后来一直没机会进行开发,结果还是个GO小白.感叹一下,要学好一门编程语言唯一的途径就是多写代码.. ...
- Go语言开发
Go语言圣经(中文版) Go编程语言规范 搭建Go开发及调试环境(LiteIDE + GoClipse) -- Windows篇 Go开发工具 Go命令行操作命令详细介绍 ...
- Go语言开发第一个Hello,World
在网上看到go语言的各种评价,也是闻名已久,但是没有自己实践过,也不知道它的好,它的坏,今天就来试试第一个小程序 第一步.如何下载 1)下载go安装程序 下载地址:https://golang.org ...
- Go语言开发环境配置
一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...
- (转载)Go语言开发环境配置
一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...
- 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...
- 从零开始搭建Go语言开发环境
一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...
- unity3D用什么语言开发好?
unity3D用什么语言开发好? 一.总结 一句话总结:选c# 同时U3D团队也会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细 ...
- 「C语言」在Windows平台搭建C语言开发环境的多种方式
新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于 Windows 平台搭建C语言集成开发环境 ...
随机推荐
- #单调队列#JZOJ 1753 锻炼身体
题目 一个\(n*m\)的矩阵,有些格子不能经过,有\(k\)个时段, 要么停留某个格子,要么沿时段规定的方向移动,问最多能够移动多少次 \(n,m,k\leq 200\) 分析 题目已经提示了\(O ...
- Git入门指南:从新手到高手的完全指南
Git是一种强大的分布式版本控制系统,广泛应用于软件开发中.它的使用不仅可以帮助开发团队更好地管理代码,还可以提高团队协作效率和代码质量.随着软件开发的不断发展,版本控制成为了程序员必备的一项技能.G ...
- Docker学习路线5:在 Docker 中实现数据持久化
Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离.默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失.为了解决这个问题并在容器生命周期内保留数据,Doc ...
- MogDB SQLdiag 使用指南
MogDB SQLdiag 使用指南 本文出处:https://www.modb.pro/db/411957 前提条件 需要保证用户提供训练数据. 如果用户通过提供的工具收集训练数据,则需要启用 WD ...
- 痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是使能i.MXRT1050, 1060 Hab签名或加密启动时App链接在片内SRAM的限制. 最近有客户反馈,在 RT1060 上测试 ...
- HDD杭州站•ArkUI让开发更灵活
原文:https://mp.weixin.qq.com/s/cX48CPs61daKOC2J5znyJw,点击链接查看更多技术内容. 7月15日的HUAWEI Developer Day(简称HDD) ...
- 鸿蒙HarmonyOS实战-ArkUI组件(页面路由)
一.路由导航 路由导航是指在应用程序中通过路径导航定位到特定页面的过程.路由导航的实现通常采用路由器(router)来进行管理,路由器根据路径的不同值将用户请求导向到不同的页面. 在HarmonyOS ...
- redis 简单整理——redis 的哈希基本结构和命令[三]
前言 简单介绍一下哈希基本结构和命令. 正文 什么是hash呢? hash也可以叫做字典.关联数组. 哈希类型是键本身又是一个键值对结构: value={{field1,value1},...{fie ...
- 力扣18(java)-四数之和(中等)
题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d ...
- 【pytorch学习】之线性代数
3 线性代数 3.1 标量 如果你曾经在餐厅支付餐费,那么应该已经知道一些基本的线性代数,比如在数字间相加或相乘.例如,北京的温度为52◦F(华氏度,除摄氏度外的另一种温度计量单位).严格来说,仅包含 ...