为什么LBCROCN错误地用一个.h前缀解析C++头文件? 我尝试用LIbCLANK解析C++头,但解析器只解析类名-并将其类型显示为Vald1。 当文件扩展名从.h更改为.cpp时,它工作正常。 经过几天的搜索,我找不到答案,有人能帮我解决这个问题吗

为什么LBCROCN错误地用一个.h前缀解析C++头文件? 我尝试用LIbCLANK解析C++头,但解析器只解析类名-并将其类型显示为Vald1。 当文件扩展名从.h更改为.cpp时,它工作正常。 经过几天的搜索,我找不到答案,有人能帮我解决这个问题吗,c++,c,clang,clang++,libclang,C++,C,Clang,Clang++,Libclang,以下是parser.cpp: #include <iostream> #include <clang-c/Index.h> // This is libclang. using namespace std; ostream& operator<<(ostream& stream, const CXString& str) { stream << clang_getCString(str); clang_dispo

以下是parser.cpp:

#include <iostream>
#include <clang-c/Index.h>  // This is libclang.
using namespace std;

ostream& operator<<(ostream& stream, const CXString& str)
{
  stream << clang_getCString(str);
  clang_disposeString(str);
  return stream;
}

int main()
{
  CXIndex index = clang_createIndex(0, 0);
  CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "tt.h", nullptr, 0,
    nullptr, 0,
    CXTranslationUnit_None);
  if (unit == nullptr)
  {
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }

  CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,
    [](CXCursor c, CXCursor parent, CXClientData client_data)
    {
      cout << "Cursor '" << (clang_getCursorSpelling(c)) << "' of kind '"
        <<(clang_getCursorKindSpelling(clang_getCursorKind(c))) << "'\n";
      return CXChildVisit_Recurse;
    },
    nullptr);

  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
  fgetc(stdin);
}
我使用以下编译命令:

clang++ main.cpp -lclang
当文件扩展名为.h时:

当文件扩展名为.cpp时: 由于LILCLANG严格地基于扩展,所以LILCLAN认为是H文件,而不是C++文件。如果你想把它解析成C++文件,你需要使用一个扩展名,LILCLAN可以将它看作是C++扩展。HH会工作,或者你需要使用CudidJixIyAgs/NuthOrjdRelixLangARGS参数显式地设置扩展:

/* Untested */
const char *command_line_args[] = {"-x", "c++", 0};
CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "tt.h", 
    command_line_args,
    (sizeof command_line_args / sizeof *command_line_args) - 1,
    nullptr, 0,
    CXTranslationUnit_None);

您可能还希望从CXTranslationUnit提取并打印诊断消息。也许,这会给你一个关于发生了什么的好线索。请参阅。

谢谢!它确实有效,诊断信息非常有用!:
/* Untested */
const char *command_line_args[] = {"-x", "c++", 0};
CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "tt.h", 
    command_line_args,
    (sizeof command_line_args / sizeof *command_line_args) - 1,
    nullptr, 0,
    CXTranslationUnit_None);