如何通过C ++样式注释(/* comment */
)自动替换所有C样式注释(// comment
)?
这必须在多个文件中自动完成。任何解决方案都可以,只要它有效。
答案 0 :(得分:17)
这个工具完成了这项工作: http://people.sc.fsu.edu/~burkardt/cpp_src/recomment/recomment.html
RECOMMENT是一个C ++程序 将C样式注释转换为C ++样式 评价。
它还处理其他人提到的所有非平凡案例:
此代码包含建议和 编码于2005年4月28日提供 JDS Uniphase的Steven Martin, Melbourne Florida。这些建议 允许程序忽略 字符串的内部内容(其中 否则似乎开始或结束 评论),处理代码行 跟踪评论,并处理 带尾随代码的注释。
答案 1 :(得分: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;
答案 2 :(得分:5)
你打算如何处理这样的情况:
void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
//blah
}
请注意parens中的注释...这是在生成的代码中记录事物或在类的实现中提及默认参数值的常用方法等。我通常不喜欢这样的注释用法,但它们很常见,需要加以考虑。我不认为你可以把它们转换成C ++风格的评论,而不用沉重的思考。
答案 3 :(得分:4)
我和那些评论你问题的人在一起。为什么这样?离开吧。
浪费时间,为版本控制添加无用的提交,搞砸的风险
编辑: 添加OP的评论中的详细信息
更喜欢C ++风格注释的根本原因是你可以注释掉可能有注释的代码块。如果该注释是C风格的,则此代码块的注释不是直截了当的。 - 未知(雅虎)
这可能是一个公平/可行的事情,但我对此有两点评论:
您还希望使用c样式的注释来阻止某段代码?或者你打算使用//阻止多行?
另一种选择是针对该情况的预处理器#ifdef。我对此感到畏缩,但这与评论行/块一样糟糕。也不应该留在生产代码中。
答案 4 :(得分: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)
答案 5 :(得分:1)
我最近将所有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.
};
答案 6 :(得分:0)
为什么不编写一个C应用来解析它自己的源文件?您可以使用相对简单的Regex查询找到/ * comments * / sections。然后,您可以使用新行字符+“//”。
替换新行字符无论如何,只是一个想法。祝你好运。
答案 7 :(得分:0)
如果您编写应用程序/脚本来处理C源文件,请注意以下事项:
您可能最好不要试图找到一个了解如何将代码实际解析为代码的应用程序。
答案 8 :(得分:0)
如果只有“几个文件”,是否真的有必要编写程序?在文本编辑器中打开它可能会在实践中更快地完成,除非有大量的注释。 emacs有一个comment-region
命令(不出所料)评论一个区域,所以它只是放弃了有问题的'/ *'和'* /'。
答案 9 :(得分:0)
您可能想尝试一些建议:
a)编写自己的代码(C / Python /您喜欢的任何语言)来替换注释。有关正则表达式或者这种天真的解决方案'可能'的工作: [除了像rmeador这样的案件,Darron发布了]
for line in file: if line[0] == "\*": buf = '//' + all charachters in the line except '\*' flag = True if flag = True: if line ends with '*/': strip off '*/' flag = False add '//' + line to buf
b)找到一个工具来做到这一点。 (如果我找到它们,我会查找一些并发布。)
c)几乎所有现代IDE(如果您使用的是)或文本编辑器都具有自动注释功能。然后,您可以手动打开每个文件,选择注释行,决定如何处理这种情况并使用加速器注释C ++样式(比如Ctrl + M)。然后,您可以再次使用您的判断“查找并替换”所有“/ *”和“* /”。我已经使用“代码注释”插件配置了Gedit这样做。我不记得我在Vim手上的方式。我确信这个很容易找到。
答案 10 :(得分:0)
很老的问题,我知道,但我刚刚使用&#34;纯emacs&#34;实现了这个目标。简而言之,解决方案如下:
运行M-x query-replace-regexp
。出现提示时,输入
/\*\(\(.\|^J\)*?\)*\*/
作为搜索的正则表达式。 ^J
是换行符,您可以按^Q
(大多数键盘中为Ctrl + Q)输入,然后按回车键。然后输入
//\,(replace-regexp-in-string "[\n]\\([ ]*?\\) \\([^ ]\\)" "\n\\1// \\2" \1))
作为替代表达。
基本上,这个想法是你使用两个嵌套的正则表达式搜索。主要的一个就是找到C风格的评论(*?
急切的重复对此非常方便。然后,使用elisp表达式仅在注释文本中执行第二次替换 。在这种情况下,我正在查找换行后跟空格,并用//
替换最后三个空格字符,这对于保留注释格式很有用(只有在所有注释都缩进的情况下才有效) )。
对二级正则表达式的更改将使此方法在其他情况下有效,例如
//\,(replace-regexp-in-string "[\n]" " " \1))
只会将原始评论的全部内容放入单个C ++风格的评论中。
答案 11 :(得分:-3)
如果提出问题,必须存在一些推理。如果你知道就回答。
永远不要使用C ++风格的评论(即//评论)。始终使用C风格 而是评论。 PHP是用C语言编写的,旨在编译 在任何符合ANSI-C的编译器下。即使很多编译器 在C代码中接受C ++风格的注释,你必须确保你的 代码也会与其他编译器一起编译。 此规则的唯一例外是Win32特定的代码, 因为Win32端口是MS-Visual C ++特有的,而且这个编译器 已知在C代码中接受C ++风格的注释。