以下は、C++ インクルード ガードのタイプミスです。両方とも読む必要があります_MYFILE_H_
。
#ifndef _MYFILE_H_
#define _MYFLIE_H_
GNU coreutils (grep、awk など) を使用して、このようなタイプミスがないか、一連のヘッダー ファイルを検索する方法を教えてください。
以下は、C++ インクルード ガードのタイプミスです。両方とも読む必要があります_MYFILE_H_
。
#ifndef _MYFILE_H_
#define _MYFLIE_H_
GNU coreutils (grep、awk など) を使用して、このようなタイプミスがないか、一連のヘッダー ファイルを検索する方法を教えてください。
使用できます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
複数の 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
その実装の問題は、ガードの上に著作権ヘッダーがない可能性があることです。
そして、これはもっと簡潔に書くことができると確信しています。
grep
正規表現は、説明している文字列のセットに一致するほど強力ではないため、ここでは機能しません。
具体的には、フォームのすべての文字列の言語
#ifndef X
#define Y
≠は通常の言語ではありませんX
。Y
これは、Myhill-Nerode の定理を使用して証明できます (#ifndef X
異なる選択肢の形式の任意の 2 つの文字列はX
、識別可能性関係の異なる等価クラスに分類されるため)。その結果、この形式の文字列に一致する正規表現を記述する方法はなく、grep
純粋な数学的正規表現を使用grep
するため、この問題を解決するために使用する方法はありません。
マイナスの結果で申し訳ありませんが、これが役立つことを願っています!