下面是C++include保护的拼写错误。两者都应读取_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 %sn", FILENAME, def, $2);
}
else was_ifdef = 0;
}
也许有更聪明的方法可以做到这一点,但这(对我来说)非常清晰和容易。
注意:如果文件包含类似的内容,这将显示"误报"
#ifndef FOO_DEFINED
typedef int foo;
#define FOO_DEFINED
#endif
grep
本身在这里不起作用,因为正则表达式的功能不足以匹配所描述的字符串集。
具体来说,形式的所有字符串的语言
#ifndef X
#define Y
其中X
≠Y
不是一种常规语言。你可以通过使用Myhill-Nerode定理来证明这一点(因为对于X
的不同选择,任何两个形式为#ifndef X
的字符串都属于可区分关系的不同等价类)。因此,没有办法编写能够匹配这种形式的字符串的正则表达式,并且由于grep
使用纯数学正则表达式,因此没有办法使用grep
来解决这个问题。
很抱歉得到了负面的结果,但我希望这能有所帮助!
多个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
该实现的问题是,在保护之上可能没有版权标头。
我确信这本书可以写得更简洁。