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

grep本身在这里不起作用,因为正则表达式的功能不足以匹配您描述的字符串集。

具体来说,表单的所有字符串的语言

#ifndef X
#define Y

其中XY不是常规语言。您可以通过使用 Myhill-Nerode 定理来证明这一点(因为#ifndef X用于不同选择的任何两个形式的字符串都X属于可区分关系的不同等价类)。结果,没有办法写出可以匹配这种形式的字符串的正则表达式,而且由于grep使用的是纯数学正则表达式,所以没有办法用它grep来解决这个问题。

抱歉,结果为阴性,但我希望这会有所帮助!

于 2013-02-21T21:03:19.173 回答
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 回答