删除C ++评论从源代码

我有一些C ++代码/* *///样式的注释。 我希望有一种方法来自动删除它们。 显然,使用编辑器(如UltraEdit的)一些正则表达式搜索/* *///应该做的工作。 但是,在仔细一看,一个完整的解决方案不是那么简单的,因为序列/ *或//可能不是评论,如果他们是在另一个注释,字符串文字或字符文字。 例如

printf(" \" \" " " /* this is not a comment and is surrounded by an unknown number of double-quotes */");

是一个双引号内的注释序列。 而且,这不是一个简单的任务,以确定是否一个字符串是一对有效双引号的内部。 虽然这

// this is a single line comment /* <--- this does not start a comment block // this is a second comment line with an */ within

里面的其他评论意见序列。

是否有一个更全面的方式来删除从C ++源代码注释考虑到字符串文字,对此有何评论? 例如,我们可以指示预处理程序删除注释,而不会进行,比方说,#include指令?

--------------解决方案-------------

在C预处理器可以删除的意见。

编辑:

我已经更新,这样我们就可以使用宏来扩大#如果报表

> cat t.cpp
/*
* Normal comment
*/
// this is a single line comment /* <--- this does not start a comment block
// this is a second comment line with an */ within
#include <stdio.h>

#if __SIZEOF_LONG__ == 4
int bits = 32;
#else
int bits = 16;
#endif

int main()
{
printf(" \" \" " " /* this is not a comment and is surrounded by an unknown number of double-quotes */");
/*
* comment with a single // line comment enbedded.
*/
int x;
// A single line comment /* Normal enbedded */ Comment
}

因为我们希望#如果报表扩大正确,我们需要定义的列表。
这是比较琐碎cpp -E -dM

然后,我们管的#define和原始文件回通过预处理器,同时防止包括被扩大了这个时候。

> cpp -E -dM t.cpp > /tmp/def
> cat /tmp/def t.cpp | sed -es/^#inc/-#inc/ | cpp - | sed s/^-#inc/#inc/
# 1 "t.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "t.cpp"

#include <stdio.h>

int bits = 32;

int main()
{
printf(" \" \" " " /* this is not a comment and is surrounded by an unknown number of double-quotes */");

int x;

}

我们的SD C ++格式化有一个选项,以漂亮的打印源文本,并删除​​所有注释。 它使用了我们完整的C ++前端分析文本,所以它不是由空格,换行,字符串或预处理程序问题混为一谈,也不是由它的格式更改将打破它的代码。

如果要删除注释,你可能试图混淆的源代码。 该格式化也进来了不解的版本。

可能有人投了我自己的答案我自己的问题。

感谢马丁纽约的想法 ,我发现,在Visual Studio中的解决方案看起来很简单(有待进一步测试)。 只需重命名所有预处理指令别的东西,(东西是不是有效的C ++语法是确定),并使用cl.exe时与/ p

cl target.cpp /P

和它产生的target.i 它包含源减去的评论。 只需重命名之前的指令回来,你去那里。 也许你将需要删除#line通过cl.exe时产生的指令。

这样做是因为根据MSDN,翻译的阶段是这样的:

在源文件中的字符映射字符映射到内部的源代码表示。 三字母序列在此阶段转换为单字符内部表示。

拼接线中的所有反斜杠(),并紧跟一个换行符结束行加入了与源文件形成了从物理线路逻辑线路中的下一行。 除非是空的,一个源文件必须结束在前面没有反斜杠换行符。

符号化的源文件被分解为预处理标记和空白字符。 在源文件中注释被替换为每一个空格字符。 换行符被保留。

预处理预处理指令的执行和宏被扩展到源文件。 #include语句调用翻译开始对任何包含文本前三款转换步骤。

字符集映射所有的源代码字符集成员和转义序列转换为它们在执行字符集当量。 对于Microsoft C和C ++,源和执行字符集是ASCII。

字符串连接所有相邻的字符串,宽字符串被连接起来。 例如,“串”“串联”变成了“字符串连接”。

翻译所有的令牌语法和语义分析; 这些标记被转换为目标代码。

链接所有的外部引用决心创建一个可执行程序或动态链接库

评论是在标记化之前的预处理阶段去除。 因此,只要确保在预处理阶段,没有什么是可用于处理(删除所有指令)和它的输出应该只是那些由以前的3个阶段进行处理。

至于用户定义的.h文件,请使用/ FI选择手动囊括其中。 所得.i文件将是的.cpp和.h的组合。 没有评论。 每一块的前面具有适当的文件名一个#行。 这样就很容易由一个编辑把它们分开。 如果我们不想手动拆分起来,也许我们需要使用一些编辑的宏/脚本编写工具来自动执行。

所以,现在,我们不必在意任何预处理指令。 更妙的是续行符(反斜杠)处理。

例如

// vc8.cpp : Defines the entry point for the console application.
//

-#include "stdafx.h"
-#include <windows.h>
-#define NOERR
-#ifdef NOERR
/* comment here */
whatever error line is ok
-#else
some error line if NOERR not defined
// comment here
-#endif
void pr() ;
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}

/*comment*/

void pr() {
printf(" /* "); /* comment inside string " */
// comment terminated by \
continue a comment line
printf(" "); /** " " string inside comment */
printf/* this is valid comment within line continuation */\
("some weird lines \
with line continuation");
}

cl.exe vc8.cpp /P就变成这样,和然后可以供给到再次CL.EXE恢复指令(并除去的#line)后

#line 1 "vc8.cpp"

-#include "stdafx.h"
-#include <windows.h>
-#define NOERR
-#ifdef NOERR

whatever error line is ok
-#else
some error line if NOERR not defined

-#endif
void pr() ;
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}

void pr() {
printf(" /* ");

printf(" ");
printf\
("some weird lines \
with line continuation");
}

您可以使用基于规则的解析器(如升压::精神)编写语法规则征求意见。 您将需要决定是否处理嵌套的意见或不依赖于你的编译器。 语义动作删除注释应该是相当简单的。

正则表达式的目的不是分析的语言,这是一个令人沮丧的尝试最好的。

实际上,你需要一个全面的解析这一点。 您不妨考虑Clang ,重写是锵库套件的明确目标,目前已经存在的rewriters实现,你可以从得到的灵感。

分类:C# 时间:2012-02-02 人气:0
分享到:

相关文章

  • 我得到的错误:致命错误:调用未定义的方法调试:: checkSessionKey()在F:\ XAMPP \ htdocs中\ cakecms \意见\网页\ home.ctp第3行 2012-11-01

    致命错误:调用未定义的方法调试:: checkSessionKey()在F:\ XAMPP \ htdocs中\ cakecms \意见\网页\ home.ctp在蛋糕PHP 3号线. --------------解决方案------------- 你们是不是要调用$这 - >会话从home.ctp? 我不认为这 - $>会话是提供给意见. 如果你显示你的代码home.ctp,我们可以更清楚地看到发生了什么事.

  • 在Visual Studio 2008中更改意见 2013-11-11

    如何更改的意见看起来像/ * * /,而不是//在VS 2008? --------------解决方案------------- // this is a line comment, it will only comment this line // for the next line you need to repeat // /* this is a block comment you can do all sort of stuff here and you won't have to

  • SQL Server 2008中嵌套意见 2012-01-30

    有没有对是否使用嵌套的一般性意见的最佳实践? 是否有一个性能命中使用嵌套的看法是什么时候? 有没有说真的有最好的做法是不是一个性能命中,直到你去4层以上深? 我问这个的原因是因为我和是否不使用它们挣扎. 这是不寻常得到一个报告请求,而我可以访问这些信息的唯一途径是通过加入20或多个表. 字段不从所有的表返回,但需要选择正确的数据. 在这种情况下,我喜欢筑巢的意见和重用在其他报告中较低级别的看法,因为如果需要更改逻辑我刚刚更新一个视图,所有报告都被更新. 许多和我一起工作的表包含的记录数以百万计.

  • MS MVC:有没有办法从标记MVC中的意见分开的C#代码? 2012-08-12

    我们的广告部泵出的HTML代码,他们不断地改变(和完全自我管理). 他们没有知识,JavaScript的,更何况C#等超出了一个纯粹的设计师的角度. 凡是在他们的领域将是纯粹的HTML和CSS(就像InDesign的是PostScript打印). 所有这一切都是真的,因为它要(真正分开的担忧). 因此,在MS MVC的观点,它看起来像规范是花边HTML用C#代码中使用<%=%>. 当然,如果我这样做,它会被删除一次更新. 使用JavaScript,我们只需找到我们需要用jQuery是什么,然后

  • SharePoint 2007的列表项审批工作流程 - 显示在列表中审批意见 2012-09-28

    我工作在SharePoint 2007的工作流开发一个用户反馈过程如下: 用户增加了一个新的项目列表(即意见,问题,关注,等等) 那么管理层通过电子邮件通知新的项目,并提示作出反应. 响应有两个要素:第一,直接批准或拒绝. 其次,提供了注释/答案的用户关注. 如果获得批准,新项目将显示在列表中 3A. 该意见在列表中也会显示在自己的专栏. 我有这个名单上启用内容审批. 我已经能够成功地完成,除了最后的所有步骤. 我怎样才能得到实际的审批意见显示在列表中? --------------解决方案--

  • Live Mail中 - 快速意见 2012-10-12

    我收到的邮件直接进入我的收件箱,而不是即使箱中选择快速检查意见快速意见. 这为在快速视图中显示用我的信箱最近才发生的事情. 任何人都可以提出该决议是什么. 谢谢 --------------解决方案------------- 嗨Paphianwysiwyg, 对于所有Windows Live Mail的问题,请张贴在的Windows Live Mail论坛查询: 邮件主题 http://www.windowslivehelp.com/forums.aspx?productid=15 戈库尔 -

  • MVC视图可以访问所有的项目,即使他们没有被项目中的意见是参考? 2012-12-12

    好了,我有点困惑,这是怎么回事用以下数据. 我们在我们的应用程序的结构如下: Portal.Web -一个MVC 3 Web应用程序基本上包含了所有的意见,脚本,CSS和HTML辅助扩展方法 Portal.Core -一个类库,这基本上是我们的业务对象,我们都包含在此项目中我们的模型. Portal.Data -另一个类库包含了NHibernate的配置和我们的DTO类. 下面是我们的用法:在控制器中,我们调用位于Portal.Core模型,该模型通过调用Portal.Data填充,所以基本上可

  • 悫的boost :: multi_array中的意见和子阵列的区别是什么 2013-01-07

    细算文档我想不通这一个. 我可以编写代码,如 typedef boost::multi_array<boost::int32_t, 3> data_t; // 3d -- typedef data_t::array_view<3>::type data_3d_view_t; // 2d -- typedef data_3d_view_t::reference data_2d_subarray_t; typedef data_t::array_view<2>::type

  • 我如何与修订文档中的意见作出回应? 2014-01-01

    原标题:"响应跟踪" 我已收到这已被跟踪的文档. 我如何给意见作出回应? --------------解决方案------------- 什么是你的"响应"的定义是什么? 如果评论实际上说明/建议重新需要进行更改,因此编辑文档. 如果你只需要回答已经提出的意见,在文档中的相应位置插入自己的意见. 否则,请词组你的问题更明确. 我在这里恐怕没人谓任何想法您的具体工作流程的要求,可能是什么. 问候, 鲍勃·J. 谢谢.

  • 如何创建Windows Phone中的意见和用的ViewModels Caliburn.Micro 2014-04-12

    好, 我决定当人们热烈讨论它来看一看calibun微. 请注意,这个问题是Windows Phone 7的背景下. 我已经下载了的NuGet包,清除了app.cs并添加了引导程序的App.xaml. 我也创建3个文件夹模型,视图,视图模型. 我想首先做的就是创建一个简单的窗口3的TextBlocks,但似乎无法找出如何. 我已阅读一应俱全,我只是无法得到它. 我也注意到Caliburn.Micro是一个VM第一种方法,但在WP7你导航到一个页面第一. 谁能解释一下如何设置我的第一个视图和视图模型

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.160 (s). 10 q(s)