6

次の単純なヘッダー、demo.hについて考えてみます。

#define PERSIST
struct Serialised
{
    int someTransientValue ;
    PERSIST int aNumberToPersist ;
};

次のコードとClangのPythonAPIを使用して、ヘッダーを反復処理します。

import sys, clang.cindex
def callexpr_visitor(node, parent, userdata):
    if node.location.file: print node.location.file, node.displayname, node.kind
    return 2
tu = clang.cindex.Index.create().parse(sys.argv[1], args=['-x', 'c++'])
clang.cindex.Cursor_visit(tu.cursor, clang.cindex.Cursor_visit_callback(callexpr_visitor), None)

これにより、ClangのASTの要素が出力され、次の出力が生成されます。

demo.hシリアル化されたCursorKind.STRUCT_DECLdemo.hsomeTransientValue
CursorKind.FIELD_DECL demo.h
aNumberToPersist CursorKind.FIELD_DECL

'aNumberToPersist'というメンバー変数に関連付けられたプリプロセッサ宣言を抽出する方法を知っている人はいますか?解析ツリーに明確に現れる方法で変数に'タグを付ける'より良い方法はありますか?

Xubuntu 12.04、clangバージョン3.1(tags / RELEASE_31 / final)、ターゲット:x86_64-unknown-linux-gnuスレッドモデル:posix。

4

1 に答える 1

5

私はおそらくこう言うでしょう:この方法ではありません。

マクロは、AST 自体では表されません。タイプ、属性など...セマンティック値を持つすべての要素が表示され(およびコメント)、オプションで、それらの一部がマクロから展開されたかどうかを照会して、元のマクロのスペルを取り戻すことができます。ただし、マクロ自体は AST にはまったく表示されません。

可能であれば、特に C++11 では、Clang を新しいattributeで拡張する方が面白いかもしれません: . C++11 では、コンパイラが知らない属性を無視する必要があるため、独自の属性を「名前空間」にすることで、自分だけがその意味を気にすることをほぼ保証できます。[[gearoid::persist]]

残念ながら、AST で表現されるように Clang に属性を教える必要があるかどうかはわかりません ( Michael Hanは常にそれらを記憶することに取り組んでいます)。いずれにせよ、 Clang DEVメーリング リスト (残念ながら、Clang ユーザー メーリング リストはありません) でより有用な回答を得ることができます。

編集今日上陸しました!Clang は、AST にすべての属性 (理解できないものも含む) を保持するようになりました。

于 2012-09-30T16:09:37.013 に答える