【问题标题】:Is it 100% safe to strip trailing whitespace from .c/.h source files?从 .c/.h 源文件中去除尾随空格是否 100% 安全?
【发布时间】:2021-07-24 02:04:48
【问题描述】:

我想自动删除 .c 和 .h 文件中的所有尾随空格,以减少导致 git 历史记录中合并冲突的垃圾等。

是否有任何可以想象的方式可以改变编译阶段的输出?或者自动执行此操作是否完全安全?

【问题讨论】:

  • 不是 C,但 C++ 具有可以包含换行符(以及扩展的尾随空格)的原始字符串文字。

标签: c whitespace removing-whitespace trailing-whitespace


【解决方案1】:

我能想到的唯一可能改变含义的情况是,如果有一个以反斜杠后跟空格结尾的宏:

#define FOO bar\<space> 

其中&lt;space&gt; 表示空格字符。在修剪之前,反斜杠会转义空格,我认为这没有任何影响。但是当您删除空格时,它会转义换行符,因此下一行将成为扩展的一部分。

由于没有理由编写这样的转义空间,这似乎是一个不太可能出现的问题。事实上,如果有这样的代码,我想他们更有可能是打算写一个多行扩展,而空格是不小心添加的。

在宏和字符串字面量之外,所有的空格序列都被视为一个空格,空格和换行符没有区别。

更新:

这种情况实际上是无效的。 C 不允许字符串或字符文字之外的转义序列,并且只有换行符可以用反斜杠转义。 GCC 有一个扩展来将其视为转义换行符(以防程序员犯了我上面描述的错误),并且在执行此操作时会打印警告。因此,删除空格会产生相同的结果,但会消除警告。

【讨论】:

  • 不一定是宏。任何带反斜杠的行:ideone.com/pvcrYS
  • 如果反斜杠后有空格,则代码无效,因为字符串文字中不允许使用原始换行符。
  • 您的代码在该行的末尾没有空格,因此无需删除任何内容。
  • 是的,你是对的,不好的例子。想不出任何类似的东西,额外的空间会使其有效并改变含义。
  • 你是对的,所以我认为没有改变行为的实际案例。
猜你喜欢
  • 2021-10-22
  • 2011-08-28
  • 2022-06-15
  • 2019-12-16
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多