9

如何自动将所有 C 样式注释 ( /* comment */) 替换为 C++ 样式注释 ( // comment)?

这必须在几个文件中自动完成。任何解决方案都可以,只要它有效。

4

12 回答 12

17

这个工具可以完成这项工作: https ://github.com/cenit/jburkardt/tree/master/recomment

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

它还处理其他人提到的所有非平凡案例:

此代码包含佛罗里达州墨尔本 JDS Uniphase 的 Steven Martin 于 2005 年 4 月 28 日提供的建议和编码。这些建议允许程序忽略字符串的内部内容(否则可能看起来像是开始或结束注释),处理带有尾随注释的代码行,以及处理带有尾随代码位的注释。

于 2009-02-12T17:44:44.223 回答
12

这不是一个小问题。

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;
于 2009-02-12T16:17:04.857 回答
5

你打算如何处理这样的情况:

void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
 //blah
}

注意括号内的注释......这是在生成的代码中记录事物的常用方法,或者在类的实现中提及默认参数值等。我通常不喜欢使用这种注释,但它们很常见,需要考虑。我不认为您可以在不经过深思熟虑的情况下将它们转换为 C++ 样式的注释。

于 2009-02-12T16:17:43.277 回答
4

我和那些在你的问题中发表评论的人在一起。为什么这样做?就别管了。

它浪费时间,在版本控制中添加了无用的提交,有搞砸的风险

编辑:从 OP 的评论中添加详细信息

首选 C++ 风格注释的根本原因是您可以注释掉其中可能包含注释的代码块。如果该注释是 C 风格的,则代码的这种块注释不是直截了当的。– 未知(雅虎)

这可能是一件公平/好的事情,但我对此有两条评论:

  • 我知道没有人会主张更改所有现有代码 - 这是对新代码的偏好。(海事组织)
  • 如果您觉得需要“注释掉代码”(另一种不确定的做法),那么您可以根据需要进行 - 而不是在此之前

看来你还想用c风格的注释来屏蔽一段代码?或者你打算使用 // 来屏蔽很多行?

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

于 2009-02-12T16:44:02.810 回答
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)
于 2009-02-12T16:25:47.970 回答
2

我最近将我们存储库中所有文件的所有 C 样式注释转换为 C++ 样式。由于找不到可以自动执行此操作的工具,因此我编写了自己的工具:c-comments-to-cpp

这不是万无一失的,但比我尝试过的任何其他方法(包括推荐)都要好。除此之外,它还支持转换 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.
};
于 2017-01-17T15:28:37.150 回答
0

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

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

于 2009-02-12T16:10:29.067 回答
0

如果您编写应用程序/脚本来处理 C 源文件,请注意以下几点:

  • 字符串中的注释字符
  • 行中间的注释字符(您可能不想拆分代码行)

您最好尝试找到一个了解如何将代码实际解析为代码的应用程序。

于 2009-02-12T16:17:05.777 回答
0

如果只有“几个文件”,真的有必要编写程序吗?在文本编辑器中打开它在实践中可能会更快,除非有一大堆评论。emacs 有一个comment-region命令(不出所料)评论一个区域,所以它只是放弃有问题的'/*'和'*/'的情况。

于 2009-02-12T16:17:08.367 回答
0

您可能想尝试一些建议:

a) 编写您自己的代码(C/Python/任何您喜欢的语言)来替换注释。类似于正则表达式所说的内容或这种天真的解决方案“可能”有效:[除非像 one rmeador 这样的情况,Darron 发布]

 
对于文件中的行:
    如果行 [0] == "\*":
       buf = '//' + 行中除 '\*' 之外的所有字符
       标志 = 真
    如果标志 = 真:
       如果行以 '*/' 结尾:
          剥离 '*/'
          标志 = 假
       添加 '//' + 行到 buf

b) 找到一个工具来做这件事。(如果我找到它们,我会查找一些并发布。)

c) 几乎所有现代 IDE(如果您正在使用的话)或文本编辑器都具有自动注释功能。然后,您可以手动打开每个文件,选择注释行,决定如何处理这种情况并使用加速器(例如 Ctrl + M)注释 C++ 样式。然后,您可以再次使用您的判断来简单地“查找和替换”所有“/*”和“*/”。我已将 Gedit 配置为使用“代码注释”插件来执行此操作。我不记得我在 Vim 中的操作方式。我相信可以很容易地找到这个。

  • 于 2009-02-12T16:27:27.543 回答
    0

    非常老的问题,我知道,但我只是使用“纯 emacs”实现了这一点。简而言之,解决方案如下所示:

    运行M-x query-replace-regexp。出现提示时,输入

    /\*\(\(.\|^J\)*?\)*\*/
    

    作为要搜索的正则表达式。这^J是一个换行符,您可以通过按^Q(在大多数键盘中为 Ctrl+Q)输入,然后按 enter 键。然后输入

    //\,(replace-regexp-in-string "[\n]\\([ ]*?\\)   \\([^ ]\\)" "\n\\1// \\2" \1))
    

    作为替换表达式。

    本质上,这个想法是您使用两个嵌套的正则表达式搜索。主要的只是找到 C 风格的注释(*?急切的重复非常方便)。然后,使用 elisp 表达式仅在注释文本内执行第二次替换。在这种情况下,我正在寻找后跟空格的换行符,并将最后三个空格字符替换为//,这对于保留注释格式非常有用(不过,只有在所有注释都缩进时才有效)。

    对辅助正则表达式的更改将使此方法在其他情况下起作用,例如

    //\,(replace-regexp-in-string "[\n]" " " \1))
    

    只会将原始注释的全部内容放入单个 C++ 样式的注释中。

    于 2014-03-12T13:58:53.600 回答
    -3

    来自 PHP 团队约定...如果提出问题,则必须存在一些推理。只要知道就回答。

    永远不要使用 C++ 风格的注释(即 // 注释)。始终使用 C 风格的注释。PHP 是用 C 语言编写的,旨在在任何符合 ANSI-C 的编译器下编译。尽管许多编译器在 C 代码中接受 C++ 样式的注释,但您必须确保您的代码也可以与其他编译器一起编译。此规则的唯一例外是特定于 Win32 的代码,因为 Win32 端口是特定于 MS-Visual C++ 的,并且已知此编译器接受 C 代码中的 C++ 样式注释。

    于 2014-04-02T16:05:50.277 回答