2013-10-16 38 views
6

Ben libclang python bağlama kullanıyorum ama python bağlama tarafından değil libclang tarafından bu sorun neden olduğunu düşünüyorum. Ben object.h çevrilmesi biriminin AST ziyaret edersenizclang benim .h dosya ayrıştırılamıyor

ben bir başlık object.h

#ifndef OBJECT_H 
#define OBJECT_H 

class Object { 
public: 
    int run(); 
}; 

#endif 

Ve uygulanmasını object.cpp

#include "object.h" 

int Object::run() { 
    int a = 0; 
    return a*a; 
} 

var, son AST düğümü VAR_DECLclass Object ve bu kadar. public:... bölümünü ziyaret etmeyecek. Doğrudan sözdizimini kontrol etmek için clang kullanırsam, başlık dosyamdan şikayetçi olurum. Ben object.cpp arasında ast dökümü clang kullanırsanız

$ clang -Xclang -ast-dump -fsyntax-only object/object.h 
object/object.h:4:1: error: unknown type name 'class' 
class Object { 
^ 
object/object.h:4:13: error: expected ';' after top level declarator 
class Object { 
      ^
      ; 
TranslationUnitDecl 0x7f816102d2d0 <<invalid sloc>> 
|-TypedefDecl 0x7f816102d7d0 <<invalid sloc>> __int128_t '__int128' 
|-TypedefDecl 0x7f816102d830 <<invalid sloc>> __uint128_t 'unsigned __int128' 
|-TypedefDecl 0x7f816102db80 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]' 
`-VarDecl 0x7f816102dbf0 <object/object.h:4:1, col:7> Object 'int' invalid 
2 errors generated. 

, o hatayı olmaz. clang object.hobject.cpp birlikte ayrıştırma yapmak birleştirmek gibi

$ clang -Xclang -ast-dump -fsyntax-only object/object.cpp 
TranslationUnitDecl 0x7fc6230302d0 <<invalid sloc>> 
|-TypedefDecl 0x7fc623030810 <<invalid sloc>> __int128_t '__int128' 
|-TypedefDecl 0x7fc623030870 <<invalid sloc>> __uint128_t 'unsigned __int128' 
|-TypedefDecl 0x7fc623030c30 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]' 
|-CXXRecordDecl 0x7fc623030c80 <object/object.h:4:1, line:7:1> class Object definition 
| |-CXXRecordDecl 0x7fc623030d90 <line:4:1, col:7> class Object 
| |-AccessSpecDecl 0x7fc623030e20 <line:5:1, col:7> public 
| `-CXXMethodDecl 0x7fc623030ea0 <line:6:3, col:11> run 'int (void)' 
`-CXXMethodDecl 0x7fc62307be10 parent 0x7fc623030c80 prev 0x7fc623030ea0 <object/object.cpp:3:1, line:6:1> run 'int (void)' 
    `-CompoundStmt 0x7fc62307c058 <line:3:19, line:6:1> 
    |-DeclStmt 0x7fc62307bf78 <line:4:3, col:12> 
    | `-VarDecl 0x7fc62307bf00 <col:3, col:11> a 'int' 
    | `-IntegerLiteral 0x7fc62307bf58 <col:11> 'int' 0 
    `-ReturnStmt 0x7fc62307c038 <line:5:3, col:12> 
     `-BinaryOperator 0x7fc62307c010 <col:10, col:12> 'int' '*' 
     |-ImplicitCastExpr 0x7fc62307bfe0 <col:10> 'int' <LValueToRValue> 
     | `-DeclRefExpr 0x7fc62307bf90 <col:10> 'int' lvalue Var 0x7fc62307bf00 'a' 'int' 
     `-ImplicitCastExpr 0x7fc62307bff8 <col:12> 'int' <LValueToRValue> 
      `-DeclRefExpr 0x7fc62307bfb8 <col:12> 'int' lvalue Var 0x7fc62307bf00 'a' 'int' 

görünüyor. Eğer öyleyse, Object'un object.cppint Object::run() { thrid satırındaki ast düğümünü nasıl alabilirim? Bunun için ast düğüm var mı? Ayrıca bana object.cpp içinde run() yöntemi ziyaret ettiğinizde gibi bir çok karıştırır

, geçerli konum object.cpp olduğunu ancak ölçüde object.h olduğunu diyecekler. Tam olarak ne anlama geliyor? Libclang API dokümanı dışındaki herhangi bir daha kolay eğitim dokümanı?

cevap

8

Clang, .h dosyanızda C++ kodunuz olduğunu bilmiyor. Varsayılan olarak, .h dosyasını düz C olarak ele alır. .cpp dosyanıza clang çalıştırdığınızda, bunun C++ çözümlemesi olduğunu bilir.

Bunu düzeltmenin iki yolu vardır. -x bayrağını kullanarak dosyasında hangi dilde

  1. Tell clang:

    clang -x c++ -Xclang -ast-dump -fsyntax-only object/object.h 
    
  2. bir .hh veya .hpp eki kullanmak için dosyayı yeniden adlandırın. Bu son ekler, dosyanın C++ kodunu içerdiğini farz edeceğini söyler.

    mv object/object.h object/object.hpp 
    clang -Xclang -ast-dump -fsyntax-only object/object.hpp 
    

    Eğer başlık dosyasını yeniden adlandırırsanız, eşleşmesi için #include deyimi değiştirmeniz gerekir.

+0

Ekstra clang araçları hakkında ne dersiniz? Örneğin, clang-query, C++ bayrağını ayarlamak için herhangi bir seçeneği yoktur. – thisEric

İlgili konular