2013-10-16 8 views
6

Sto usando il binding Python di libclang ma penso che questo problema sia causato da libclang non dal binding di python.clang non può analizzare il mio file .h standalone

Ho un colpo di testa object.h

#ifndef OBJECT_H 
#define OBJECT_H 

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

#endif 

E un'implementazione object.cpp

#include "object.h" 

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

Se visito AST della unità di traduzione di object.h, l'ultimo nodo AST è VAR_DECLclass Object e basta. Non visiterà la parte public:.... Se uso clang per verificare direttamente la sintassi, mi lamenterei del fatto che il mio file di intestazione è sbagliato.

$ 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. 

Se uso clangore di scaricare ast di object.cpp, non avrò tale errore.

$ 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' 

Sembra clang combinano object.hobject.cpp insieme poi fare il parsing. Se è così, come faccio a ottenere il nodo ast di Object nella riga di collegamento di object.cppint Object::run() {? C'è un nodo ast per questo?

E mi confonde anche un po 'come quando visito il metodo run() in object.cpp, si dirà posizione attuale è in object.cpp, ma nella misura in cui è in object.h. Che cosa significa esattamente l'estensione? Qualsiasi documento tutorial più semplice diverso dal documento API libclang?

risposta

8

Clang non sa di avere il codice C++ nel file .h. Per impostazione predefinita, considera un file .h come semplice C. Quando si esegue clang sul file .cpp, esso sa che sta analizzando C++.

Ci sono due modi per risolvere questo problema.

  1. di Tell clang che lingua è nel file utilizzando il flag -x:

    clang -x c++ -Xclang -ast-dump -fsyntax-only object/object.h 
    
  2. rinominare il file per utilizzare un suffisso .hh o .hpp. Questi suffissi dicono a clang di assumere che il file contenga codice C++.

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

    Se si rinomina il file di intestazione, è necessario cambiare la sua dichiarazione #include da abbinare.

+0

quali sono gli strumenti di clang aggiuntivi? Ad esempio clang-query, non ha alcuna opzione per impostare il flag C++ – thisEric

Problemi correlati