使用gnu coreutils在C++中查找include-guard类型错误

Find include guard typos in C++ with gnu coreutils

本文关键字:查找 include-guard 类型 错误 C++ gnu coreutils 使用      更新时间:2023-10-16

下面是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

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

该实现的问题是,在保护之上可能没有版权标头。

我确信这本书可以写得更简洁。