如何自动将所有 C 样式注释 ( /* comment */
) 替换为 C++ 样式注释 ( // comment
)?
这必须在几个文件中自动完成。任何解决方案都可以,只要它有效。
这个工具可以完成这项工作: https ://github.com/cenit/jburkardt/tree/master/recomment
RECOMMENT 是一个 C++ 程序,它将 C 风格的注释转换为 C++ 风格的注释。
它还处理其他人提到的所有非平凡案例:
此代码包含佛罗里达州墨尔本 JDS Uniphase 的 Steven Martin 于 2005 年 4 月 28 日提供的建议和编码。这些建议允许程序忽略字符串的内部内容(否则可能看起来像是开始或结束注释),处理带有尾随注释的代码行,以及处理带有尾随代码位的注释。
这不是一个小问题。
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;
你打算如何处理这样的情况:
void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
//blah
}
注意括号内的注释......这是在生成的代码中记录事物的常用方法,或者在类的实现中提及默认参数值等。我通常不喜欢使用这种注释,但它们很常见,需要考虑。我不认为您可以在不经过深思熟虑的情况下将它们转换为 C++ 样式的注释。
我和那些在你的问题中发表评论的人在一起。为什么这样做?就别管了。
它浪费时间,在版本控制中添加了无用的提交,有搞砸的风险
编辑:从 OP 的评论中添加详细信息
首选 C++ 风格注释的根本原因是您可以注释掉其中可能包含注释的代码块。如果该注释是 C 风格的,则代码的这种块注释不是直截了当的。– 未知(雅虎)
这可能是一件公平/好的事情,但我对此有两条评论:
看来你还想用c风格的注释来屏蔽一段代码?或者你打算使用 // 来屏蔽很多行?
一种替代方法是针对这种情况的预处理器#ifdef。我对此感到畏缩,但这与注释掉行/块一样糟糕。两者都不应该留在生产代码中。
这是一个 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)
我最近将我们存储库中所有文件的所有 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.
};
为什么不编写一个 C 应用程序来解析它自己的源文件?您可以通过相对简单的正则表达式查询找到 /* 注释 */ 部分。然后,您可以用换行符+“//”替换换行符。
无论如何,只是一个想法。祝你好运。
如果您编写应用程序/脚本来处理 C 源文件,请注意以下几点:
您最好尝试找到一个了解如何将代码实际解析为代码的应用程序。
如果只有“几个文件”,真的有必要编写程序吗?在文本编辑器中打开它在实践中可能会更快,除非有一大堆评论。emacs 有一个comment-region
命令(不出所料)评论一个区域,所以它只是放弃有问题的'/*'和'*/'的情况。
您可能想尝试一些建议:
a) 编写您自己的代码(C/Python/任何您喜欢的语言)来替换注释。类似于正则表达式所说的内容或这种天真的解决方案“可能”有效:[除非像 one rmeador 这样的情况,Darron 发布]
对于文件中的行: 如果行 [0] == "\*": buf = '//' + 行中除 '\*' 之外的所有字符 标志 = 真 如果标志 = 真: 如果行以 '*/' 结尾: 剥离 '*/' 标志 = 假 添加 '//' + 行到 buf
b) 找到一个工具来做这件事。(如果我找到它们,我会查找一些并发布。)
c) 几乎所有现代 IDE(如果您正在使用的话)或文本编辑器都具有自动注释功能。然后,您可以手动打开每个文件,选择注释行,决定如何处理这种情况并使用加速器(例如 Ctrl + M)注释 C++ 样式。然后,您可以再次使用您的判断来简单地“查找和替换”所有“/*”和“*/”。我已将 Gedit 配置为使用“代码注释”插件来执行此操作。我不记得我在 Vim 中的操作方式。我相信可以很容易地找到这个。
非常老的问题,我知道,但我只是使用“纯 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++ 样式的注释中。
来自 PHP 团队约定...如果提出问题,则必须存在一些推理。只要知道就回答。
永远不要使用 C++ 风格的注释(即 // 注释)。始终使用 C 风格的注释。PHP 是用 C 语言编写的,旨在在任何符合 ANSI-C 的编译器下编译。尽管许多编译器在 C 代码中接受 C++ 样式的注释,但您必须确保您的代码也可以与其他编译器一起编译。此规则的唯一例外是特定于 Win32 的代码,因为 Win32 端口是特定于 MS-Visual C++ 的,并且已知此编译器接受 C 代码中的 C++ 样式注释。