【问题标题】:Find include guard typos in C++ with gnu coreutils使用 gnu coreutils 在 C++ 中查找包含保护错别字
【发布时间】:2013-02-21 20:45:52
【问题描述】:

以下是 C++ 包含防护的错字。两者都应该是_MYFILE_H_

#ifndef _MYFILE_H_
#define _MYFLIE_H_

您如何建议使用 GNU coreutils(例如 grep、awk)在一堆头文件中搜索这样的错字?

【问题讨论】:

  • 节省时间和#define MYFLIE_H MYFILE_H
  • 我刚刚学会了一个简单的 egrep 搜索不会做:stackoverflow.com/q/3717772
  • 两者都不应该是_MYFILE_H_<g> 以下划线后跟大写字母开头的名称和包含两个连续下划线的名称保留给实现。不要使用它们。
  • 由于缺乏 C++ 知识,我知道一些 awk、grep。我不明白你想做什么......:(
  • @Agentlien - 请参阅 17.6.4.3 [reserved.names] /1:“C++ 标准库保留以下类型的名称:macros ...”。唷,这真是一种解脱!

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


【解决方案1】:

你可以使用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

【讨论】:

  • 我并不是真的想那么具体。我实际上在问题中也提到了 awk,所以谢谢。
  • 好的,删除了我的评论,并添加了关于“潜在误报”的注释。
  • 正如您所说,这造成了一些误报(主要是宏功能),但我能够在您的脚本中找到另一个错字。谢谢!
【解决方案2】:

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

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

#ifndef X
#define Y

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

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

【讨论】:

    【解决方案3】:

    多个 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
    

    该实现的问题是,防护上方可能没有版权标头。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2015-12-31
      • 1970-01-01
      • 2012-07-29
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多