0

我无法使用 libclang 解析 C++ 中命名空间函数的主体。

我在命名空间中有一个类,如下所示:

namespace outer {
    namespace inner {
        class MyClass {
            public:
                short myMethod(){
                    return NTOHS(10);
                }

                short anotherMethod();
        };

        short MyClass::anotherMethod(){
            return NTOHS(11);
        }

        short myFunction(){
            return NTOHS(12);
        }
    }
}

使用 libclang 的 python 包装器,我可以通过递归找到每个节点:

def find_node(node):
    print node  # Just print stuff about the node (spelling, location, etc.)
    for child in node.get_children():
        find_node(child)

我能够检测到 NTOHS 的使用情况myMethodmyFunction打印有关这些节点的信息,但无法在MyClass::anotherMethod.

其他人遇到了类似的问题,但似乎没有得到解答。

这里的 NTOHS 只是用于将网络转换为主机顺序的 linux/unix 命令。

如何使用 libclang 检测命名空间函数中的 NTOHS?

4

1 回答 1

0

我怀疑这个问题可能与您的问题中不存在的信息有关,并且它可能取决于您使用的平台和版本的 clang,以及NTOHS您所指的版本。

在 OSX Yostemite 上,NTOHS定义为:

#define NTOHS(x)    (x) = ntohs((__uint16_t)x) 

为了让你的样本编译,我不得不引入一个临时的。

在 Ubuntu 14.04NTOHS上,不在 中/usr/include,而是ntohs在,并且定义为(类似于):

#define ntohs(x)        __bswap_16 (x)

为了让您的示例能够编译,我必须切换到ntohs.

为了完整起见,在 Ubuntu 14.04 上,我使用了这个示例:

#include <netinet/in.h>

namespace outer {
    namespace inner {
        class MyClass {
            public:
                short myMethod(){
                    return ntohs(10);
                }

                short anotherMethod();
        };

        short MyClass::anotherMethod(){
            return ntohs(11);
        }

        short myFunction(){
            return ntohs(12);
        }
    }
}

http://llvm.org/apt/trusty/并从(在我为 libclang 设置包含路径之后)得到了这棵带有 clang 3.7 的树

TRANSLATION_UNIT sample.cpp
  +--NAMESPACE outer
     +--NAMESPACE inner
        +--CLASS_DECL MyClass
        |  +--CXX_ACCESS_SPEC_DECL
        |  +--CXX_METHOD myMethod
        |  |  +--COMPOUND_STMT
        |  |     +--RETURN_STMT
        |  |        +--UNEXPOSED_EXPR ntohs
        |  |           +--CALL_EXPR ntohs
        |  |              +--UNEXPOSED_EXPR ntohs
        |  |              |  +--DECL_REF_EXPR ntohs
        |  |              +--UNEXPOSED_EXPR
        |  |                 +--INTEGER_LITERAL
        |  +--CXX_METHOD anotherMethod
        +--CXX_METHOD anotherMethod
        |  +--TYPE_REF class outer::inner::MyClass
        |  +--COMPOUND_STMT
        |     +--RETURN_STMT
        |        +--UNEXPOSED_EXPR ntohs
        |           +--CALL_EXPR ntohs
        |              +--UNEXPOSED_EXPR ntohs
        |              |  +--DECL_REF_EXPR ntohs
        |              +--UNEXPOSED_EXPR
        |                 +--INTEGER_LITERAL
        +--FUNCTION_DECL myFunction
           +--COMPOUND_STMT
              +--RETURN_STMT
                 +--UNEXPOSED_EXPR ntohs
                    +--CALL_EXPR ntohs
                       +--UNEXPOSED_EXPR ntohs
                       |  +--DECL_REF_EXPR ntohs
                       +--UNEXPOSED_EXPR
                          +--INTEGER_LITERAL
于 2016-02-25T12:52:55.880 回答