以下是C ++包含警卫的拼写错误。两者都应该是_MYFILE_H_
。
#ifndef _MYFILE_H_
#define _MYFLIE_H_
您如何使用GNU coreutils(例如grep,awk)建议使用这样的拼写错误搜索一堆头文件?
答案 0 :(得分: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
答案 1 :(得分:1)
grep
本身在这里不起作用,因为正则表达式的功能不足以匹配您所描述的字符串集。
具体来说,是表格中所有字符串的语言
#ifndef X
#define Y
X
≠Y
不是常规语言。你可以通过使用Myhill-Nerode定理来证明这一点(因为#ifndef X
的任何两个字符串对于X
的不同选择都属于可区分关系的不同等价类。因此,无法编写可以匹配此表单字符串的正则表达式,并且由于grep
使用纯数学正则表达式,因此无法使用grep
来解决此问题。
对于否定的结果感到抱歉,但我希望这有帮助!
答案 2 :(得分: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
该实施的问题是,警卫上方可能没有版权标题。
而且我很确定这可以写得更简洁。