Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名_C++_Clang - Fatal编程技术网

C++ CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名

C++ CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名,c++,clang,C++,Clang,我有一个clang::VarDecl对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还略读了一个问题:- 但我想这与声明变量的文件名无关。 我还提到 没有任何函数可以返回文件名。有谁能告诉我如何获取它吗?您应该使用SourceManager从SourceLocation获取具体数据。特别是,请看一下 您可以通过使用获取SourceManager的实例。无需创建SourceManager对象MatchFinder::MatchResult::Context为我提供了ASTConte

我有一个
clang::VarDecl
对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还略读了一个问题:-

但我想这与声明变量的文件名无关。 我还提到


没有任何函数可以返回文件名。有谁能告诉我如何获取它吗?

您应该使用
SourceManager
SourceLocation
获取具体数据。特别是,请看一下


您可以通过使用获取
SourceManager
的实例。

无需创建
SourceManager
对象
MatchFinder::MatchResult::Context
为我提供了
ASTContext*
,我可以调用
getSourceManager
来获取
SourceManager
对象。剩下的就跟我们之前做的一样

class VarDeclPrinter : public MatchFinder::MatchCallback {
  public:

  virtual void run(const MatchFinder::MatchResult &Result) {

    SourceManager &srcMgr = Result.Context->getSourceManager();

    if(const VarDecl* var = Result.Nodes.getNodeAs<VarDecl>("var")) {
      if(var->isFunctionOrMethodVarDecl()) {
        cout << setw(20) << left << "Local Variable: " << var->getName().str() << "\t\t";
        cout << ((CXXMethodDecl*)(var->getParentFunctionOrMethod()))->getQualifiedNameAsString() << "\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
      if(var->hasExternalStorage()) {
        cout << setw(20) << left << "External Variable: " << var->getName().str() << "\t\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
      else if(var->hasGlobalStorage()) {
        cout << setw(20) << left << "Global Variable: " << var->getName().str() << "\t\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
    }
  }
};
class VarDeclPrinter:public MatchFinder::MatchCallback{
公众:
虚拟无效运行(常量MatchFinder::MatchResult和Result){
SourceManager&srcMgr=Result.Context->getSourceManager();
if(const VarDecl*var=Result.Nodes.getNodeAs(“var”)){
如果(var->isFunctionOrMethodVarDecl()){

但是
CompilerInstance::createSourceManager
的返回类型为void。我如何获取它的实例?与
CompilerInstance::createFileManager
相同。我不熟悉CLang libtooling,您能进一步解释一下吗?谢谢您的帮助。但是当我尝试使用
ci.getSourceManager().getFilename()时(var->getLocation()).str()
,其中
ci
CompilerInstance
的对象,
var
VarDecl
的对象,那么我得到了分段错误。这是gdb所说的:-
程序收到信号SIGSEGV,分段错误。clang::SourceManager::getFileID中的0x08060d52(此=0x0,拼写LOC=…)在/home/prakar/Source/CLang/llvm/tools/CLang/include/CLang/Basic/SourceManager.h:974中。您知道此错误的原因吗?我发现
&ci.getSourceManager()
每次都为空。至少告诉我是否缺少什么?我是否必须在CompilerInstance中初始化SourceManager?如果是,那么如何构造SourceManager?@Prakhamishra您是否先创建了源代码管理器(使用
createSourceManager
方法)?由于
CompilerInstance.cpp
中的
compileModule
fn,我了解了如何创建
SourceManager
。即使在调用
createSourceManager
之前,也需要调用
CompilerInstance
对象上的
createDiagnostics
,否则会出现
segmentation fault
。谢谢谢谢你的帮助,奥克。