Skip to main content

针对 C/C++ 源代码更正的工具,允许自动查找和复制/粘贴新函数定义

项目描述

cppguts

如果您的项目依赖于一些外部 C/C++ 项目,并且您想对外部函数/方法进行一些更改,然后自动复制/粘贴这些更改 - 这个包可能会对您有所帮助。

有两个工具:

  1. editcpp用于编辑源代码;
  2. 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

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

cppguts-1.0.2.tar.gz (8.9 kB 查看哈希

已上传 source