【问题标题】:using cpp preprocessing replaces 0x0D with 0x0A in a string使用 cpp 预处理将字符串中的 0x0D 替换为 0x0A
【发布时间】:2013-05-01 00:31:03
【问题描述】:

在我的工作场所,我们正在使用旧的专有语言和一些 C 宏。为了编译此代码,必须使用脚本对其进行大量修饰,我希望将其标准化为实际的 makefile。

现在我遇到了一个问题,即代码中的某些字符串定义中有 0x0D (\r) 字符,这些字符在通过 cpp 推送后显示为 0x0A (\n) 并阻止编译。

我尝试过运行 sed -e 's/\x0A/\x0D/g' 但这(以及大量排列)似乎对输出没有任何影响。关于如何解决这个问题的任何想法?

【问题讨论】:

  • 你能用示例代码行说明你的意思吗?该字符串是否包含\r 序列、\x0A\012 或者是文字回车,还是其他?如果是字面回车,那问题一定是“为什么”?
  • 这是一个无法真正呈现的文字回车字符串,由于我没有编写代码,我不知道为什么不幸。
  • 我会仔细研究您的旧语言,看看是否有任何方法可以避免在字符串中嵌入回车。通常(但并非总是)有一种方法可以包含此类字符——可能使用 ASCII(13) 或其他一些函数调用。如果您确实无法避免将它们包含在原始源中,那么我会考虑是否有其他字符(可能是 ^A,control-A)未出现在源中。然后我会考虑在将代码传递给 C 预处理器之前将所有 ^M(回车)映射到 ^A,然后在提交编译之前将 ^A 映射回 ^M。
  • 不幸的是,更改源是不可能的。我想我们在同一页面上,因为我在预处理代码时做了您在下面建议的操作,因此它不会在 cpp 中更改。我真的试图避免递归地为包含语句搜索源文件,以便我可以将它们预处理到临时目录中。摇滚 - 我 - 硬地
  • 嗯。那么这是否可以归结为用两个 ascii 字符“\”和“r”替换不紧跟换行符的文字回车? $ perl -pe 's/\r(?!\n)/\\r/g'.

标签: linux sed makefile preprocessor


【解决方案1】:

unix2mac。这是在 cygwin 上的 dos2unix 包中,因此可能在您的 linux 发行版上的一个类似名称的包中。

【讨论】:

  • 唉,这不会这样做,因为它将我的 \x0A 转换为 \x0A \x0D
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2015-10-04
相关资源
最近更新 更多