使用libclang解析命名空间函数

时间:2016-02-23 13:39:59

标签: python c++ libclang

我无法使用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)

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

Someone else ran into a similar problem, but it doesn't seem to have been answered.

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

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

1 个答案:

答案 0 :(得分:0)

我怀疑此问题可能与您的问题中没有的信息有关,并且可能取决于您使用的clang的平台和版本,以及您{39}的哪个版本{39}}重新引用。

在OSX Yostemite上,NTOHS定义为:

NTOHS

要让你的样本编译,我必须引入一个临时的。

在Ubuntu 14.04上,#define NTOHS(x) (x) = ntohs((__uint16_t)x) 不在NTOHS,但是/usr/include是,并且定义为(类似):

ntohs

要让你的样本编译,我必须切换到#define ntohs(x) __bswap_16 (x)

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

ntohs

#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); } } } 得到这个用clang 3.7的树(在我为libclang设置我的包含路径之后)

http://llvm.org/apt/trusty/