英语法语西班牙语

Ad


OnWorks 网站图标

cpphs - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 cpphs

这是 cpphs 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


cpphs - 为 Haskell 开放的类似 cpp 的预处理器

概要


CPPHs [文件名|OPTION] ...

商品描述


CPPHs 是一种自由化的重新实施 CPP (1) C 预处理器,in 和 for
哈斯克尔。

为什么要重新实现cpp? 不管对错,C 预处理器在 Haskell 中被广泛使用
源代码。 它为不同的编译器、不同的编译器启用条件编译
相同编译器的版本和不同的操作系统平台。 它也偶尔使用
因为它的宏语言,它可以启用某些形式的特定于平台的细节——
填充,例如繁琐的实例定义和 FFI 样板生成
声明。 但是,除了明显的审美之外,cpp还有两个问题
那些:

对于某些 Haskell 系统,尤其是 Windows 上的 Hugs,真正的 cpp 无法通过
默认。

即使对于其他 Haskell 系统,gcc 3.x 系列提供的通用 cpp
正在以与 Haskell 语法不兼容的方式微妙地改变。 有
一直存在问题,例如字符串间隙和素数字符
身份标识。 这些问题只会变得更糟。

因此,尝试提供 cpp 的替代品似乎是正确的,两者都与
Haskell,并且它本身是用 Haskell 编写的,以便它可以与编译器一起分发。

CPPHs 功能非常齐全,并与 -传统 cpp的风格。
它有两种模式:

仅条件编译 (--诺宏),

和完整的宏扩展(默认)。

In --诺宏 模式, CPPHs 只执行条件编译动作,即 的#include的,
#如果的,和 #ifdef的根据文本替换定义进行处理(命令-
行和内部),但不执行参数化宏扩展。 在全
兼容模式(默认)、文本替换和宏扩展也是
在非 cpp 文本的剩余正文中处理。

工作特点:

#ifdef 简单的条件编译

#如果 defined()、&&、||、== 等的完整布尔语言。

#elif 链式条件

#定义
内嵌定义(文本替换和宏)

#undef 在线撤销定义

的#include
文件包含

#线 行号指令

\n 所有 # 指令中的行延续

/ ** / 宏定义中的标记串联

## ANSI 样式的令牌链接

# ANSI 风格的令牌字符串化

__文件__
DIY 错误消息的特殊文本替换

__线__
DIY 错误消息的特殊文本替换

__日期__
特殊文本替换

__时间__
特殊文本替换

宏展开是递归的。 重新定义宏名称不会产生警告。
可以在命令行上定义宏 -D 就像文本替换一样。 宏
名称可以是 Haskell 标识符,例如带有主要的 ` 和反引号 ´
字符,比 C 中稍微宽松一些,但它们仍然可能不包含运算符
符号。

保留输出中的行数,以便任何后来的处理器都可以给出
有意义的错误信息。 当一个文件是 的#include'd, CPPHs 插件 #线 指令
同样的原因。 即使存在续行,编号也应该是正确的。
如果你不想 #线 指令在最终输出中,使用 --诺琳 选项。

cpp 指令中的任何语法错误都会向 stderr 发出消息并停止程序。
找不到 #include 文件会向 stderr 发出警告,但处理仍在继续。

您可以在命令行上提供任意数量的文件名。 结果被链接到
标准输出。

-D符号 定义文本替换(默认值为 1)

-Dsym=VAL
定义具有特定值的文本替换

-I 为#include 的搜索路径添加一个目录

-O文件 指定输出文件(默认为标准输出)

--诺宏
只处理 #ifdef 和 #include,
不要扩展宏

--诺琳
从输出中删除 #line 丢弃

- 跳闸
将 C 风格的注释转换为空白,甚至在外部
cpp 指令

--哈希
识别 ANSI # stringise 操作符,以及 ## for
宏内的标记串联

- 文本 将输入视为纯文本,而不是 Haskell 代码

- 布局
在宏扩展中保留换行符

--未点亮
删除文学风格的评论

- 版
报告cpphs的版本号并停止

默认情况下没有定义文本替换。 (正常的cpp通常有定义
用于机器、操作系统等。如果您愿意,这些可以很容易地添加到 cpphs 源代码中。)
搜索路径按顺序搜索 -I 选项,除了目录
调用文件,然后是当前目录,总是首先搜索。 再次,没有
默认搜索路径(同样,这可以轻松更改)。

差异性 CPP


一般来说,cpphs 是基于 -传统 行为,而不是 ANSI C,并且具有
以下与标准 cpp 的主要区别。

总类

# 引入任何 cpp 指令必须在一行的第一列(而
ANSI 允许在 # ).

生成 #线 n "文件名" 语法,而不是 # n "文件名" 变种。

C 注释仅从 cpp 指令中删除。 他们没有从其他人身上剥离
文本。 考虑例如在 Haskell 中,以下所有操作都是有效的
符号: /* */ * / * 但是,您可以使用 - 跳闸 选项。

语言

接受 / ** / 用于宏定义中的标记粘贴。 然而, /* */ (任何文字
在打开/关闭注释之间)插入空格。

ANSI ## 令牌粘贴运算符可用于 --哈希 旗帜。 这是为了避免
误解任何同名的有效 Haskell 运算符。

将宏形参替换为实际的,甚至在字符串内部(双精度或单精度)
引)。 这是 - 传统行为,ANSI 不支持。

承认 # 仅当您使用 --哈希
选项。 (这是一个 ANSI 添加,只需要因为引用的字符串化(上面)是
ANSI 禁止。)

完全保留文本替换定义中的空格(模换行符),
但消除了前导和尾随空格。

精确地(模
换行符),但消除了前导空格。

完全保留宏调用参数中的空格(包括换行符),但前导
并消除尾随空格。

随着 - 布局 选项,文本替换或宏定义中的行延续
在宏调用中保留为换行符。 (对于布局敏感的代码很有用
哈斯克尔。)

使用 onworks.net 服务在线使用 cpphs


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad