1

コメントに doxygen アノテーションを含む C ソース コードをいくつか継承しました。ビット腐敗により、\returnコメントの注釈の一部が嘘になりました。つまり、関数は void を返すように変換されましたが、\returnコメントはまだそこにあり、そうではありません。

例:

/*!
 * \brief   The foo function
 * \return  OK if successful, ERROR otherwise
 */
void foo(void)
{
    ...
}

これがそうであるすべてのファイルを見つけたいと思います。grep/sed/awk/perl を使用して を見つけ、\returnで始まる次の行を出力することを考えましたvoid。シンプルな

 grep -E '(\\return|^void)' file ...

\return非 void 関数からのすべてのコメントも出力します。行が表示された場合に前の行のみを印刷する簡単な方法があると確信しています。\return^void

4

2 に答える 2

2

すべての関数とその前のコメントが投稿したスタイルに従っている場合は、これで十分かもしれません。

awk '/\\return/{cmt=$0} /^[[:alpha:]]/{ if (/^void/ && cmt) print cmt ORS $0; cmt=""}' file

例えば:

$ cat file
/*!
 * \brief   The foo function
 * \return  OK if successful, ERROR otherwise
 */
void foo(void)
{
    ...
}

/*!
 * \brief   The bar function
 * \return  OK if successful, ERROR otherwise
 */
int bar(void)
{
    ...
}

$ awk '/\\return/{cmt=$0} /^[[:alpha:]]/{ if (/^void/ && cmt) print cmt ORS $0; cmt=""}' file
 * \return  OK if successful, ERROR otherwise
void foo(void)
于 2013-08-27T15:33:17.800 に答える
1
#! /usr/bin/env perl

use strict;
use warnings;

my $prev_return;

while (<>) {
  # assume letter in first column introduces a function return type
  if (my($return_type) = /^([^\W\d]\w*)/) {
    if ($return_type eq "void" && defined $prev_return) {
      print $prev_return;
    }
    undef $prev_return;  # reset after each function definition
  }
  elsif (/\\return\b/) {
    $prev_return = "$ARGV:$.: $_";
  }
}
continue {
  close ARGV if eof;  # reset $. at the end of each named file
}

注: このパターン[^\W\d]は、二重否定技法を使用して、数字ではない「単語文字」、つまり文字やアンダースコアに一致させます。

出力例:

$ cat file.c
/*!
 * \brief foo 関数
 * \成功した場合は OK を返し、それ以外の場合は ERROR を返します
 */
void foo(ボイド)
{
    ...
}

\return fdsklj
ボイドバー(void)

ボイドバズ

$ ./doxygen-return-void file.c
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj

ダイヤモンド演算子としても知られるPerl の<>を使用すると、Unix スタイルのフィルターを簡単に作成できます。これは、好きなだけパスに名前を付けることができることを意味します。

$ ./doxygen-return-void file.c file.c
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj

上記のプログラムも標準入力を消費しますが、出力はあまり役に立ちません。

$ cat file.c | ./doxygen-return-void
-:3: * \成功した場合は OK を返し、それ以外の場合は ERROR を返します
-:10: \return fdsklj
于 2013-08-27T18:51:50.400 に答える