2013-10-16 20 views
6

私はlibclangのpythonバインディングを使用していますが、この問題はPythonバインディングではなくlibclangによって発生していると思います。私はobject.hの翻訳単位のASTを訪問すればclangは私の.hファイルをスタンドアロンで解析できません

私は、ヘッダーobject.h

#ifndef OBJECT_H 
#define OBJECT_H 

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

#endif 

と実装object.cpp

#include "object.h" 

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

を持って、最後のASTノードはVAR_DECLclass Objectあると、それはそれです。それはpublic:...部分を訪問しません。私が構文を直接チェックするためにclangを使用すると、私のヘッダファイルに関する文句は間違っています。

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

私はobject.cppのASTをダンプするために打ち鳴らすを使用している場合、私はそのエラーを持っていません。

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

打ち鳴らすは、構文解析を行い、その後、一緒object.hobject.cppを組み合わせたように思えます。 その場合、object.cppint Object::run() {の最後の行にあるObjectのastノードを取得するにはどうすればよいですか?そのためのastノードがありますか?また、私がobject.cpprun()方法を訪れたときのようにたくさんの混乱

、それが現在の場所がobject.cppであるが、程度はobject.hであると言うだろう。エクステントは正確にはどういう意味ですか? libclang APIドキュメント以外の簡単なチュートリアルドキュメントはありますか?

答えて

8

Clangは、.hファイルにC++コードがあることを知りません。既定では、.hファイルをプレーンCとして扱います。.cppファイルでclangを実行すると、C++を解析中であることがわかります。

これを解決するには2通りの方法があります。

  1. -xフラグを使用してファイルにあるどの言語

    テルの打ち鳴らす:

    clang -x c++ -Xclang -ast-dump -fsyntax-only object/object.h 
    
  2. .hhまたは.hpp接尾辞を使用するようにファイルの名前を変更します。これらの接尾辞は、ファイルにC++コードが含まれていると仮定するようにclangに指示します。

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

    ヘッダーファイルの名前を変更する場合は、一致するように#includeステートメントを変更する必要があります。

+0

エクストラクランツールはどうですか?たとえばclang-queryのように、C++フラグを設定するオプションはありません – thisEric

関連する問題