2016-02-23 91 views
0

我無法使用libclang解析C++中名稱空間函數的正文。使用libclang解析名稱空間函數

我有一個命名空間中的一類,像這樣:

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中檢測到它。這裏

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

ntohs和僅僅是用於將網絡主機爲了在Linux/Unix命令。

如何在命名空間函數中使用libclang來檢測NTOHS?

+0

你確定你在'anotherMethod'的* definition *節點而不是之前的* declaration *嗎? –

+0

@KurtStutsman我很確定我可以找到聲明,但不是定義。 –

回答

0

我懷疑這個問題可能與您的問題中不存在的信息有關,並且可能取決於您使用的是哪個平臺和版本的叮噹聲以及您指的是哪個版本的NTOHS

在OSX Yostemite,NTOHS被定義爲:

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

,甚至讓你的樣品編譯我已經向大家介紹一個臨時的。

在Ubuntu 14.04,NTOHS/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/得到這個樹鐺3.7(以後我會爲我設置包括libclang路徑)

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