用C++风格的注释替换C风格的注释。

10

如何自动将所有C语言风格的注释(/* 注释 */)替换为C++语言风格的注释(// 注释)?

必须在多个文件中自动完成此操作。只要能实现,任何解决方案都可以。


9
我很好奇你为什么想这么做?C++编译器可以很好地编译C风格的注释,所以这样做有什么意义呢?你可能不想再添加任何C风格的注释,但是保留旧的注释不会对任何事情造成损害。 - Michael Kohne
3
为什么会有人认为这个问题是冒犯的? - David Thornley
3
这个问题很浪费时间,不是从解析的角度来看,而是因为它尝试实现的无意义任务。 - Tanveer Badar
7
-1 Tanveer。也许这是一项来自高层的命令。如果管理层告诉你挖一个洞然后再填上,有时候你只能去做,尽管这样做毫无意义。 - j_random_hacker
9
可能有很多原因需要你这么做。也许你有某种预处理器或其他工具。也许你只是需要遵循编码惯例。询问如何重构文本并无意义,因为我们的生计来自于精心构造的文本。 - Sarah G
显示剩余4条评论
12个回答

17

这个工具可以胜任此工作:https://github.com/cenit/jburkardt/tree/master/recomment

RECOMMENT是一个C++程序,它可以将C语言风格的注释转换为C++风格的注释。

同时,它还处理了其他人提到的所有非常规情况:

代码中包含了Steven Martin于2005年4月28日在JDS Uniphase,Florida Melbourne提供的建议和编码。这些建议使该程序能够忽略字符串内部的内容(否则可能会看作是开始或结束注释),处理带有尾随注释的代码行,并处理带有尾随代码片段的注释。


很遗憾,RECOMMENT在处理缩进和格式方面表现不佳,并且完全不支持Doxygen注释。这就是为什么我创建了c-comments-to-cpp的原因。 - m-bitsnbites

11

这不是一个简单的问题。

int * /* foo 
  /* this is not the beginning of a comment.

int * */ var = NULL;

你想用什么替换它?任何真正的替换有时都需要拆分行。

int * // foo
  // this is not the beginning of a comment.
// int *
var = NULL;

这不是对原问题的答案。 - m-bitsnbites

5
你打算如何处理这样的情况:
void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
 //blah
}

请注意圆括号内的注释... 这是生成代码中常见的记录方式,或在类的实现中提及默认参数值等。我通常不喜欢这种注释的用法,但它们很常见,需要考虑到它们。我认为你不能将它们转换为 C++ 风格的注释,而不做出一些深思熟虑的决定。

有一个相当简单(但不理想的)解决方案。 如果您要替换的每个注释都不以0或空格字符和换行符结尾,则插入一个换行符。 因此,换句话说,“IDispatch ** ppVal”将在新行上。 - Evan Teran
不要误会,我同意你的看法,转换是一个不好的想法。 - Evan Teran
1
这不是一个答案。 - m-bitsnbites

3

我同意在你的问题中评论的人的观点。为什么要这样做呢?就让它保持原样吧。

这会浪费时间,增加无用的版本控制提交,有可能弄乱代码。

编辑:

更喜欢C++风格的注释的根本原因是可以注释掉一段可能有注释的代码块。如果是C风格的注释,则注释掉代码块不是直截了当的。- 未知(雅虎)

这也许是一个公平/可以接受的事情,但我对此有两点评论:

  • 我不认识任何一个主张修改所有现有代码的人 - 这只是针对新代码的偏好。(在我看来)
  • 如果你感觉需要“注释掉代码”(另一个不可靠的做法),那么你可以根据需要进行操作 - 不必事先这样做。

你似乎还想使用C风格的注释来屏蔽一段代码?还是你要使用//来屏蔽多行代码?

一种替代方案是针对这种情况的预处理器#ifdef。我对此感到震惊,但它和注释掉行/块一样糟糕。两者都不应该留在生产代码中。


1
优先选择C++风格注释的根本原因是可以注释掉可能包含注释的代码块。如果使用C风格,则这个注释块代码的注释掉并不直观。 - compie
好的。有两点需要注意:1. 我不知道有谁会主张更改所有现有的代码 - 这只是针对新代码的偏好。(在我看来)2. 如果你感觉需要“注释掉代码”(另一种不太可靠的做法),那么你可以根据需要进行操作,而不是提前进行。 - Tim
在我的编辑器中,注释掉可能包含注释的代码块非常简单,只需要两个按键即可。取消注释同样也很简单。为什么要费那么多劲呢?使用一个好的编辑器就可以了。 - JasonTrue
3
-1,因为这并没有回答问题,而且大多数只是在说这个想法很愚蠢。这就是评论的作用。 - Travis

3

我最近将代码库中所有的C风格注释都转换成了C++风格。由于我找不到一个可以自动执行此操作的工具,所以我写了自己的工具:c-comments-to-cpp

虽然它并非完美无缺,但是比我尝试过的其他任何工具(包括RECOMMENT)都要好得多。其中之一是,它支持转换Doxygen风格的注释,例如:

/**
* @brief My foo struct.
*/
struct foo {
  int bar;  /*!< This is a member.
                 It also has a meaning. */
};

转换为:

/// @brief My foo struct.
struct foo {
  int bar;  ///< This is a member.
            ///< It also has a meaning.
};

2
这里有一个Python脚本,可以(大部分)完成这项工作。它可以处理大多数边缘情况,但无法处理字符串内的注释字符,不过这应该很容易修复。
#!/usr/bin/python

import sys

out = ''
in_comment = False

file = open(sys.argv[1], 'r+')
for line in file:
    if in_comment:
        end = line.find('*/')
        if end != -1:
            out += '//' + line[:end] + '\n'
            out += ' ' * (end + 2) + line[end+2:]
            in_comment = False
        else:
            out += '//' + line
    else:
        start = line.find('/*')
        cpp_start = line.find('//')
        if start != -1 and (cpp_start == -1 or cpp_start > start):
            out += line[:start] + '//' + line[start+2:]
            in_comment = True
        else:
            out += line

file.seek(0)
file.write(out)

0

为什么不编写一个C应用程序来解析自己的源文件呢?您可以使用相对简单的正则表达式查询找到/*注释*/部分。然后,您可以将换行符替换为换行符+“//”。

无论如何,这只是一个想法。祝你好运。


你为什么要用C语言做这个?有很多其他更适合正则表达式搜索和替换的编程语言。而且,为什么要解析“它自己”的源文件呢? - Draemon
我可以说用C语言来完成这个任务,因为假设OP已经了解C语言。话虽如此,我认为避免使用C语言相对繁琐的操作,花费一些时间学习更好的编程语言来完成这个任务是非常值得的。个人建议使用Python,但也有很多其他选择。 - EBGreen
2
正则表达式无论如何都不够用,需要一个真正的解析器。 - Darron
当然,如果你能获取一个符合 ANSI 标准的 C++ 编译器的源代码,那么你就有了一个解析器。 :) - EBGreen
1
同意Darron的观点 - 你不能在这个例子中使用正则表达式: printf("////**** this better not be changed, it's a string literal!\n"); 需要一个真正的C语言解析器。 - Adam Davis
我会担心一个源代码仓库,如果你无法拼凑出一个“足够好”的正则表达式,然后再手动修复任何问题。 - Draemon

0
如果您编写一个应用程序/脚本来处理C源文件,这里有一些需要注意的事项:
  • 字符串中的注释字符
  • 行中间的注释字符(您可能不想拆分代码行)
您最好尝试找到一个真正理解如何解析代码的应用程序。

0

如果只有“几个文件”,是否真的需要编写程序?在实践中,用文本编辑器打开它可能更快,除非有很多注释。emacs 有一个 comment-region 命令(不出所料)可以对区域进行注释,因此只需删除有问题的 '/*' 和 '*/'。


许多文本编辑器也会提供“在文件中查找和替换”的功能。无论如何,您都需要进行快速的视觉检查,以处理其他帖子中提到的所有边角情况。 - bobince

0

这里有几个建议你可以尝试:

a)编写自己的代码(C/Python/任何你喜欢的语言)来替换注释。可以参考regex所说的或者这个简单的解决方案'可能'有效: [除了像rmeador和Darron发布的那种情况]

for line in file:
    if line[0] == "\*":
       buf = '//' + 去掉'\*'后的所有字符
       flag = True
    if flag = True:
       if line ends with '*/':
          去掉'*/'
          flag = False
       add '//' + line to buf

b)寻找一个工具来完成它。(如果我找到了,我会发帖的。)

c) 现代几乎所有的 IDE(如果你在使用)或文本编辑器都有自动注释功能。你可以手动打开每个文件,选择注释行,决定如何处理情况,然后使用加速键(例如 Ctrl + M)进行 C++ 样式的注释。然后,你可以简单地使用“查找和替换”所有的 "/*" 和 "*/",再次运用你的判断。我已经在 Gedit 中配置了使用“代码注释”插件来实现这一点。我不记得我在 Vim 中是如何做到的。但我相信这样的设置很容易找到。


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接