Javascript 友好的预处理器困境

标签 javascript preprocessor c-preprocessor

我从事一个(即将完成的)Javascript 项目已有 14 个多月了。该项目一开始是一个 hack,我希望它能在一夜之间完成,但随着时间的推移,Javascript 部分已经成长为 68 个独立的文件和 10,314 行非空行,遗憾的是目前依赖于 C 预处理器来构建。

很难解释我是如何最终将 cpp 用于 Javascript 的:这只是一个 hack,我需要一些可以给我宏扩展、ifdef、define 和 include 的东西,而不需要太多努力。经过大约 3 秒的考虑,我意识到 cpp 非常适合这个任务:

  • 提供一个在 Release模式下消失的 LOG() 宏。
  • 提供一个在 Release模式下消失的 ASSERT() 宏,并生成标有原始文件和行号的异常。
  • 将 LOG() 和 ASSERT() 实现替换为允许生成“已检查”构建的代码,该构建会在事件发生时以紧凑的形式记录事件,如果发生崩溃,这些事件会报告回服务器。
  • 根据与 Python 后端共享的配置文件,将 PROJECT_SOME_CONFIG_VAR_NAME 替换为“1”。

像所有真正的 hack 一样,这个 hack 现在已经被硬编码到项目中,我什至不想去想替换它所需的工作。我的项目已经到了我想将代码库移动到它自己的专用测试服务器(而不是我的笔记本电脑)的阶段,但是在设置 Linux 实例时,我发现 4.1 之后的 GNU cpp 版本不再预处理 Javascript因错误而崩溃。

与其将特定版本的 GCC 添加到构建要求列表中,我认为现在是真正解决这个问题的好时机。不过,我的问题是,我找不到具有与 cpp 相同功能和特性的替代预处理器!我考虑过 m4,但 m4 本身就是一个痛苦的世界。我发现其他特定于 Javascript 的预处理器缺少我目前依赖的所有功能,例如:

  • __FILE__ & __LINE__
  • 可变参数宏
  • 包括 guard
  • token 连接
  • 条件编译

我正在认真考虑为 Javascript 实现一个全新的预处理器,它完全借用了 C 预处理器语法,因为它运行良好。我只是想知道在这样做之前是否有更好的选择。 :) 也许已经有一个类似 cpp 的通用预处理器我可以交换?替换这 68 个文件中的所有预处理器语法所需的工作量接近于简单地重新实现预处理器所需的工作量。

我很惊讶我能在依赖 C 预处理器的情况下做到这一点;在这项任务中,它比大脑理解健康更有效。对我开放的另一个选择是为 Linux、Darwin-i386、Win32 静态构建 cpp-4.1 版本,并将这些二进制文件存储在项目的存储库中。

帮助!

最佳答案

你试过了吗mcpp ?这是一个“可移植 C 预处理器”

如果失败,您可以尝试使用通用宏处理器(如 gema)并在其上构建足够的 cpp。

关于Javascript 友好的预处理器困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072716/

相关文章:

c++ - 解析器如何处理预处理器和条件编译?

C++:宏参数中可以有空格吗?

c - 禁用 Code::Blocks 中的编译和链接?

javascript - 将 Vue 组件暴露给外部项目

javascript - 我的汉堡包下拉菜单出现在移动设备上 'How it works' 页面的 slider 后面,分页与文本混淆

用于将 PDF 文件显示为活页簿的 Javascript 库?

c# - #define 宏的 C 到 C# 转换

javascript - jQuery - "blind"中的选项 "setInterval"仍在运行

javascript - 生成具有延续性的Javascript代码的诀窍是什么?

visual-studio - 通用 Windows 平台的预处理器定义?