Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用libclang获得函数的深度?_C++_Libclang - Fatal编程技术网

C++ 如何使用libclang获得函数的深度?

C++ 如何使用libclang获得函数的深度?,c++,libclang,C++,Libclang,我目前正在使用libclang为一个学校项目进行静态代码分析。我已经把它设置好并开始工作了,到目前为止,我已经获得了一个函数的文件位置和物理长度(行数),但接下来我想得到的是函数的深度 为了清楚起见,在我看来,任何给定行上函数的深度都是围绕该行的嵌套if/for/while/etc块的数量。假设采用标准语法,深度将与行开始处的制表符/空格数相关 一个函数的总深度就是它的最深线条的深度。例如,其深度为2: int foo() { int n = 0; // Depth 0 for

我目前正在使用libclang为一个学校项目进行静态代码分析。我已经把它设置好并开始工作了,到目前为止,我已经获得了一个函数的文件位置和物理长度(行数),但接下来我想得到的是函数的深度

为了清楚起见,在我看来,任何给定行上函数的深度都是围绕该行的嵌套if/for/while/etc块的数量。假设采用标准语法,深度将与行开始处的制表符/空格数相关

一个函数的总深度就是它的最深线条的深度。例如,其深度为2:

int foo()
{
    int n = 0; // Depth 0
    for (int i = 0; i < 10; ++i)
    {
        n = bar(i); // Depth 1
        if (i < n)
            ++n; // Depth 2, deepest line
    }
}
intfoo()
{
int n=0;//深度0
对于(int i=0;i<10;++i)
{
n=巴(i);//深度1
if(i
您可以通过编写

  • 在输入深度时,将深度设置为零
  • 每次输入节点时增加深度,如
  • 每次离开其中一个节点时减小深度
  • 当您离开函数时,深度应该为零,并且您可以沿途跟踪最大深度

对不起,对我来说,你的“澄清”没有那么清楚。我想您想知道它们的嵌套深度,而不是存在多少嵌套if/循环。添加一个更完整的示例会有所帮助。在您发布的示例中,有1个嵌套构造,其深度为2@idclev463035818抱歉,添加了更多的说明和更好的示例,希望这样就足够了。因此,如果我读对了,我需要做的是检查
(kind==CXCursorKind::CXCursor\u CompoundStmt)
来告诉我何时输入复合语句。但是,我如何知道何时离开其中一个节点?对于复合语句的入口和出口,这是否都是真的?如果是这样的话,我如何判断我是来还是走?这是一个使用访问者模式的树遍历。铿锵包装器进行前序或后序遍历。光标按指定的顺序访问所有节点,并调用移动类型的特定方法。在本例中,为了退出,您需要实现
clang::RecursiveASTVisitor::dataTraverseStmtPost
-