2

同僚から、 ...スコープprintf(...);にない--cコードファイル内の--への呼び出しを見つけるための正規表現(POSIX構文)を考え出すように頼まれました。#ifdef#endif

しかし、私はUniで正規表現について学んでいるだけなので、完全に自信を持っているわけではありません。

シナリオは次のようになります。

possibly some code
printf(some_parameters);  // This should match
possibly more code

#ifdef DEBUG
possibly some code
printf(some_parameters);  // This shouldn't match
possibly more code
#endif

possibly some code
printf(some_parameters);  // This should also match
possibly more code

cファイルには#ifdef /#endifステートメントがまったく含まれていない可能性があることに注意してください。その場合、へのすべての呼び出しprintf();が一致する必要があります。

私がこれまでに試したことはこれです:

(?<!(#ifdef [A-Å0-9]+)).*printf\(.*\);.*(?!(#endif))

...。*の位置(さらには包含/除外)をいじってみてください

ヘルプやヒントをいただければ幸いです。

4

2 に答える 2

1

正規表現はこれにアプローチする良い方法ではありません。複数行の検索にはうまく対応できず、表現できるパターンに制限があります。たとえば、任意のネストをregexenで指定することはできません。

この問題に取り組む適切な方法は、Cコードの条件付きコンパイルディレクティブを処理するように設計されたツールを使用することです。これは、コンパイラのCプリプロセッサ、または次のような専用ツールになりますunifdef

$ unifdef -UDEBUG file.c | grep printf
printf(some_parameters);  // This should match
printf(some_parameters);  // This should also match

マニュアルから:

UNIFDEF(1)                BSD General Commands Manual               UNIFDEF(1)

NAME
     unifdef, unifdefall — remove preprocessor conditionals from code

SYNOPSIS
     unifdef [-ceklst] [-Ipath -Dsym[=val] -Usym -iDsym[=val] -iUsym] ... [file]
     unifdefall [-Ipath] ... file

DESCRIPTION
     The unifdef utility selectively processes conditional cpp(1) directives.
     It removes from a file both the directives and any additional text that
     they specify should be removed, while otherwise leaving the file alone.

     The unifdef utility acts on #if, #ifdef, #ifndef, #elif, #else, and #endif
     lines, and it understands only the commonly-used subset of the expression
     syntax for #if and #elif lines.  It handles integer values of symbols
     defined on the command line, the defined() operator applied to symbols
     defined or undefined on the command line, the operators !, <, >, <=, >=,
     ==, !=, &&, ||, and parenthesized expressions.  Anything that it does not
     understand is passed through unharmed.  It only processes #ifdef and
     #ifndef directives if the symbol is specified on the command line, other‐
     wise they are also passed through unchanged.  By default, it ignores #if
     and #elif lines with constant expressions, or they may be processed by
     specifying the -k flag on the command line.
于 2012-09-27T09:09:20.930 に答える
0

正規表現は必要ありません。

cpp -D<your #define options here> | grep printf
于 2012-09-27T09:06:41.487 に答える