3

header.hクラス定義に展開されるマクロ定義を含むヘッダーと、このマクロをインクルードして使用するソース ファイルtest.cppがありますheader.h。それから私はRecursiveASTVisitorすべてのを訪問するために使用しCXXRecordDeclます。

マクロ (test.cpp 内) の展開である CXXRecordDecl にアクセスし、それをクエリするSourceLocationと、場所はマクロ定義の場所をdump()指します。header.h

この CXXRecordDecl のために取得する必要があるのはSourceLocation、マクロ展開です。私の場合は、test.cpp.

前もって感謝します。

4

1 に答える 1

5

解決策が見つかりました。

必要なメソッドは SourceManager のgetFileLoc(SourceLocation loc)locで、 「マクロの場所」の場合は「展開場所を返します」。

通常のクラス定義とマクロ展開としての定義の両方のソースの場所を取得する私のコード:

bool VisitCXXRecordDecl(CXXRecordDecl* record)
{
    SourceLocation loc = record->getLocStart();
    SourceLocation locExp = m_sourceManager.getFileLoc(loc);
    // if record is a macro expansion in test.cpp, locExp points to test.cpp
    // if record is not a macro expansion, locExp correctly points to matching source file
}
于 2015-09-22T16:24:20.423 に答える