首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从C源文件中删除所有/* */注释?

如何从C源文件中删除所有/* */注释?
EN

Stack Overflow用户
提问于 2009-11-11 19:15:25
回答 10查看 8.9K关注 0票数 14

我有一个从其他地方复制的C文件,但它有很多如下注释:

代码语言:javascript
复制
int matrix[20];
/* generate data */
for (index = 0 ;index < 20; index++)
matrix[index] = index + 1;
/* print original data */
for (index = 0; index < 5 ;index++)

如何删除由/**/包围的所有注释。有时,注释由4-5行组成,我需要删除所有这些行。

基本上,我需要删除/**/之间的所有文本,甚至\n也可以介于两者之间。请使用sedawkperl中的一个来帮助我完成此操作。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-11-11 22:38:06

为什么不使用c预处理器来做这件事呢?为什么要把自己限制在一个自家生产的正则表达式中?

编辑此方法还可以干净利落地处理Barts printf(".../*...")方案

示例:

代码语言:javascript
复制
[File: t.c]
/* This is a comment */
int main () {
    /* 
     * This
     * is 
     * a
     * multiline
     * comment
     */
    int f = 42;
    /*
     * More comments
     */
    return 0;
}

代码语言:javascript
复制
$ cpp -P t.c
int main () {







    int f = 42;



    return 0;
}

或者,您可以删除空格并压缩所有内容

代码语言:javascript
复制
$ cpp -P t.c | egrep -v "^[ \t]*$"
int main () {
    int f = 42;
    return 0;
}

重新发明轮子是没有用的,不是吗?

编辑如果您不想通过此方法展开包含的文件和宏,cpp会为此提供标志。考虑一下:

文件: t.c

代码语言:javascript
复制
#include <stdio.h>
int main () {
    int f = 42;
    printf("   /*  ");
    printf("   */  ");
    return 0;
}

代码语言:javascript
复制
$ cpp -P -fpreprocessed t.c | grep -v "^[ \t]*$"
#include <stdio.h>
int main () {
    int f = 42;
    printf("   /*  ");
    printf("   */  ");
    return 0;
}

有一点需要注意的是,可以避免宏扩展,但会从源代码中剥离宏的原始定义。

票数 32
EN

Stack Overflow用户

发布于 2009-11-11 19:19:21

参见perlfaq6。这是一个相当复杂的场景。

代码语言:javascript
复制
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;

一句警告--一旦你这样做了,你有没有一个测试场景来证明你只是删除了评论,没有什么有价值的东西?如果您正在运行如此强大的regexp,我将确保某种类型的测试(即使您只是记录之前/之后的行为)。

票数 12
EN

Stack Overflow用户

发布于 2009-11-11 20:14:12

看一看strip_comments routine in Inline::Filters

代码语言:javascript
复制
sub strip_comments {
    my ($txt, $opn, $cls, @quotes) = @_;
    my $i = -1;
    while (++$i < length $txt) {
    my $closer;
        if (grep {my $r=substr($txt,$i,length($_)) eq $_; $closer=$_ if $r; $r}
        @quotes) {
        $i = skip_quoted($txt, $i, $closer);
        next;
        }
        if (substr($txt, $i, length($opn)) eq $opn) {
        my $e = index($txt, $cls, $i) + length($cls);
        substr($txt, $i, $e-$i) =~ s/[^\n]/ /g;
        $i--;
        next;
        }
    }
    return $txt;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1714530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档