如何在 C 语言中将所有 // 注释更改为 /* */ 注释? [关闭]

Posted

技术标签:

【中文标题】如何在 C 语言中将所有 // 注释更改为 /* */ 注释? [关闭]【英文标题】:How can I change all // comments into /* */ comments in C language? [closed] 【发布时间】:2021-12-21 10:51:25 【问题描述】:

我有一些 c 源文件。在里面,有多个 '//' 样式的 cmets 和其他 '/* */' 样式的。

我想将它们全部更改为 /* */ 以便在我的代码中更加统一,并尊重标准列宽。

如何自动更改所有这些 cmets?

感谢您的阅读!


编辑:我只是意识到我没有解释一些重要的事情。我需要更改我的 cmets 以使其与 C89 兼容。其余的编码风格已经兼容。只是我不想删除所有评论或手动编辑所有评论。而且我认为这也是一个有趣的问题。

【问题讨论】:

如果不为 C 编写解析器,通常是不可能的。如果你有一些语言的小子集并且不需要处理像 printf("foo // bar\n") 这样需要保持不变的事情,那么它可能是可能的,但你d 需要定义该子集并提供用该子集编写的程序的综合示例。您可能想在 Google 上搜索“C 美化器”,看看它们中是否有人按照您的意愿行事。 有一些“美化”工具可以为您做到这一点。好的编辑器或 IDE 也可以为您做到这一点。 我有一些 c 源文件。它们的代码总行数是多少? IMO,你想反其道而行之。将所有 K&R 转换为 ANSI。我这样做的 perl 脚本 [在任一方向] 大约 200 行 我会使用 sed 's;//\(.*\);/*\1 */; 之类的东西,但我必须返回并确保它没有基于 // 进行转换,它碰巧发现它在字符串文字中。 (如果文件数量相对较少,我可能会在 emacs 中使用 query-replace-regexp ——但是,我是 emacs 用户。) 【参考方案1】:

是否有单行黑魔法 awk/bash 或 python 可以帮助我解决这个问题,而无需花费数小时手动更改?

不确定,但一个 C 程序(大多数时候)编写代码并不太难,而且是一个有趣的项目。

大多数代码可以一次解析 1 个 char 到 state machine 以跟踪 5 个处理状态中的哪一个:in_code、in_slash_star_comment、in_slash_slash_comment、in_double_quote、in_single_quote。 然后发出相同的输出,除非在 in_slash_slash_comment 中进行了修改。

【讨论】:

哈!但不要忘记事情会变得很时髦,`"this is a valid \"/* string */*!" 不包含 cmets,所以如果你要基于字符,你需要有转义序列处理,也是。 (我喜欢这个答案。非常“动手,不要犹豫,你可能会学到一些东西”) @MarcusMüller 是的,转义序列增加了乐趣。迂腐:别忘了trigraphs。 OTOH,让我们忘记三元组。【参考方案2】:

通常,这将是代码格式化程序的工作,并且您至少需要能够 lex C,而这并不是您想要在 shell 脚本或 awk 程序中实现的东西。

相反,例如,clang-format 有很多选项可以调整 cmets 的外观,并且几乎可以在任何桌面操作系统上使用。

请注意,对单行 cmets 使用 // 实际上很好,恕我直言,使用 /* */ 语法并没有任何好处。

【讨论】:

// .. eol/* .... */ 有一个独特的好处:允许使用旧的 C89 进行编译 - 并不是说​​其余代码也不需要更改。 是的,但是如果之前编译的代码库,那是不会改变的。 我已经使用这种转换将代码从 C99(在一台机器/编译器上)移植到 C89(在另一台机器/编译器上),因此它是第一次在新目标上编译。 有了你的回答,我意识到这是一个比我以前想的要复杂得多的问题。 但是使用 C 词法分析器(比如使用 clang)应该是可能的,不是吗?还是我误解了你的答案?

以上是关于如何在 C 语言中将所有 // 注释更改为 /* */ 注释? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中将 mediumtext 列更改为 varchar? (换表)

如何在python中将大于零的多维数组的所有值更改为1? [复制]

如何在所有幻灯片中将标题、文本和点指示符的位置更改为左下角

如何在 Qt Creator 中将默认的预选应用程序类型从普通 C 应用程序永久更改为普通 C++ 应用程序?

如何在 Angular 中将此模板驱动的表单更改为反应式表单?

如何在 Windows 10 中将 Jupyter Notebook 的默认浏览器更改为 Microsoft Edge?