0

以下は、C++ インクルード ガードのタイプミスです。両方とも読む必要があります_MYFILE_H_

#ifndef _MYFILE_H_
#define _MYFLIE_H_

GNU coreutils (grep、awk など) を使用して、このようなタイプミスがないか、一連のヘッダー ファイルを検索する方法を教えてください。

4

3 に答える 3

2

使用できますawk

{
  if ($1 == "#ifndef") { was_ifdef = 1; def = $2 }
  else if ($1 == "#define" && was_ifdef) 
    { 
      if ($2 != def)   printf("Mismatch in %s: expected %s found %s\n", FILENAME, def, $2);
    }
  else was_ifdef = 0;
}

これを行うにはもっと賢い方法があるかもしれませんが、これは(私にとって)非常に明確で簡単です。

注:ファイルに次のようなものが含まれている場合、これは「誤検知」を示します

#ifndef FOO_DEFINED
typedef int foo;
#define FOO_DEFINED 
#endif
于 2013-02-21T21:14:26.997 に答える
1

複数の sed コマンドでうまくいく可能性があります。

for FILENAME in ./*.h; do
     [[ $(sed -n '1p' "$FILENAME" | sed -e 's/#ifndef //') != $(sed -n '2p' "$FILENAME" | sed -e 's/#define //') ]] && echo "$FILENAME"
end

その実装の問題は、ガードの上に著作権ヘッダーがない可能性があることです。

そして、これはもっと簡潔に書くことができると確信しています。

于 2013-02-21T21:05:53.797 に答える
1

grep正規表現は、説明している文字列のセットに一致するほど強力ではないため、ここでは機能しません。

具体的には、フォームのすべての文字列の言語

#ifndef X
#define Y

≠は通常の言語ではありませんXYこれは、Myhill-Nerode の定理を使用して証明できます (#ifndef X異なる選択肢の形式の任意の 2 つの文字列はX、識別可能性関係の異なる等価クラスに分類されるため)。その結果、この形式の文字列に一致する正規表現を記述する方法はなく、grep純粋な数学的正規表現を使用grepするため、この問題を解決するために使用する方法はありません。

マイナスの結果で申し訳ありませんが、これが役立つことを願っています!

于 2013-02-21T21:03:19.173 に答える