使用gnu coreutils在C++中查找include-guard类型错误
Find include guard typos in C++ with gnu coreutils
下面是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
该实现的问题是,在保护之上可能没有版权标头。
我确信这本书可以写得更简洁。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 既然存在危险,为什么项目要使用-I include开关
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- Cmake,在 /usr/local/include 中查找头文件,在 /usr/local/lib 中查找库
- 当我在xcode项目中使用 #include < OpenGL/gl.h>行时,它会在哪里查找gl.h文件?
- #include在查找预编译头文件时跳过——查找预编译头文件时意外结束
- 如何在main.cpp中使用多个头文件时使用Include-guard
- 查找include比forward声明更好的用例
- 使用gnu coreutils在C++中查找include-guard类型错误
- c 预处理器 - C++ #include查找是否有任何标准要求
- 在.cpp(不是.h)中include guard的功能是什么?