针对 C/C++ 源代码更正的工具,允许自动查找和复制/粘贴新函数定义
项目描述
cppguts
如果您的项目依赖于一些外部 C/C++ 项目,并且您想对外部函数/方法进行一些更改,然后自动复制/粘贴这些更改 - 这个包可能会对您有所帮助。
有两个工具:
editcpp用于编辑源代码;dumpcpp用于打印有关 C/C++ 翻译单元的一些信息
我们将讨论editcpp它是客观的工具。
editcpp不适用于模板。
editcpp工具背后的想法
editcpp用于libclang在文本文件(.c、.h、或任何 C/C++ 扩展名).hpp中查找函数/方法定义的开始/结束行。解析预处理器指令中包含的所有内容。然后工具选择在和中定义的所有函数和方法
(它假设您知道新旧函数/方法定义所在的位置)并尝试找到匹配的函数/方法。之后复制函数/方法定义并将其粘贴到同时删除旧的函数/方法定义。.cpplibclangdest.cppsrc.cpp#includeeditcppdest.cppsrc.cppeditcppsrc.cppdest.cpp
<ins>查找常用功能editcpp检查:</ins>
- 它们都是定义吗?
- 他们都是常量吗?
- 它们都是静态的吗?
- 他们都是重要的吗?
- 它们都是功能吗?
- 它们都是方法吗?
- 他们都有相同的名字吗?
- 它们是否都具有相同的返回类型和 arg 类型?
- 他们都有相同的语义父(类名)吗?(仅适用于方法)
笔记
- 您可以在
editcppotions 之后自由传递任何 clang 参数,但不要将没有标志的文件传递给 clang(就像我们通常在使用 clang 时所做的那样) - 如果您解析包含非标准标题的文件,那么您可能需要将
-I<include_dir>标志传递给 clang 以包含目录; - 如果您解析
C++文件,则可能需要传递-std=c++03(或更高)标志以通知 clang 该文件是C++; - 如果您的新函数/方法定义使用外部类型,则必须预先声明这些类型(不必定义它们);
请记住,在editcpp找到常用功能/方法后,它只会将选定的文本行从一个文件复制到另一个文件
例子
原始函数/方法定义文件dest.h:
#include <iostream>
// helper class that is used by the target class `Src`
class SrcPrivate {
public:
SrcPrivate(){};
void add(int v){
val += v;
}
void substract(int v){
val -= v;
}
private:
int val;
}
// target class
class Src {
// method defined inside the class
void add(SrcPrivate p, int v){
p.add(v);
}
// method defined outside the class
void substract(SrcPrivate p, int v);
// we won't tuch this method
void untouched_print(int v){
std::cout << "The value is:\t" << v << std::endl;
}
}
void Src::substract(SrcPrivate p, int v){
p.substract(v);
}
// simple function
void foo(int &v){
v--;
}
namespace ns {
// function in namespace
void bar(int &v){
v++;
}
}
新函数/方法定义文件src.h:
class SrcPrivate; // declare helper type
// target class
class Src {
// NEW method definition inside class
void add(SrcPrivate p, int v){
p.add(v) + 10;
}
// NEW method definition ouside class
void substract(SrcPrivate p, int v);
}
void Src::substract(SrcPrivate p, int v){
p.substract(v) - 10;
}
// NEW simple function definition
void foo(int &v){
v -= 10;
}
// NEW function definition in namespace
namespace ns {
void bar(int &v){
v += 10;
}
}
跑:
editcpp --src-file=src.h --dest-file=dest.h --oldfile-keep -std=c++03
告诉 clang将-std=c++03文件解析为 C++。此外,您可能需要使用任何其他 clang 标志,例如-I包含文件所需的目录。
--oldfile-keep(默认)用于保留原始文件(将通过添加_OLD_N后缀来重命名)。否则使用--oldfile-delete删除原始文件。
另一种选择是运行测试(尽管测试会删除所有生成的文件,因此您最好查看/testsdir):
python -m unittest cppguts.tests.test_cppguts