从源代码中删除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预处理器可以删除注释.

编辑:

我已更新,以便我们可以使用MACROS扩展#if语句

> 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
}

因为我们希望#if语句正确扩展,所以我们需要一个定义列表.
那是相对微不足道的. cpp -E -dM.

然后我们将#defines和原始文件通过预处理器传回,但这次阻止了包含的扩展.

> cpp -E -dM t.cpp > /tmp/def
> cat /tmp/def t.cpp | sed -e s/^#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;

}
上一篇:c – 在Unix环境中隐藏代码中的注释


下一篇:MySQL Workbench中列和表的注释