使用gnu coreutils在C ++中查找包含防范拼写错误

时间:2013-02-21 20:45:53

标签: c++ grep include-guards gnu-coreutils

以下是C ++包含警卫的拼写错误。两者都应该是_MYFILE_H_

#ifndef _MYFILE_H_
#define _MYFLIE_H_

您如何使用GNU coreutils(例如grep,awk)建议使用这样的拼写错误搜索一堆头文件?

3 个答案:

答案 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

XY不是常规语言。你可以通过使用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

该实施的问题是,警卫上方可能没有版权标题。

而且我很确定这可以写得更简洁。