Я пытаюсь определить типы данных в исходном коде C ++ с помощью libclang. Моя программа
#include <stdio.h>
#include <stdlib.h>
#include <clang-c/Index.h>
int main(int argc, char *argv[])
{
CXIndex index;
CXTranslationUnit tu;
CXFile file;
CXSourceLocation loc;
CXCursor cursor, def;
CXType type;
CXString typesp;
const char *types;
char const *args[2] = {"-x", "c++"};
index = clang_createIndex(0, 0);
tu = clang_createTranslationUnitFromSourceFile(index, argv[1],
2, args, 0, NULL);
file = clang_getFile(tu, argv[1]);
loc = clang_getLocation(tu, file, atoi(argv[2]), atoi(argv[3]));
cursor = clang_getCursor(tu, loc);
if (clang_isPreprocessing(cursor.kind))
printf("Preprocessor\n");
else {
def = clang_getCursorDefinition(cursor);
if (clang_Cursor_isNull(def))
type = clang_getCursorType(cursor);
else
type = clang_getCursorType(def);
typesp = clang_getTypeSpelling(type);
types = clang_getCString(typesp);
printf("%s\n", types);
clang_disposeString(typesp);
}
clang_disposeTranslationUnit(tu);
clang_disposeIndex(index);
}
И тестовый исходный код helloworld.cpp, который я передаю своей программе
#include <iostream>
int main()
{
long t;
t = 0;
std::cout << "Hello World!";
}
Когда я передаю исходный код теста в программу в аргументы командной строки, например ./program helloworld.cpp 7 2
, он не может определить тип переменной t
. Я наблюдал значение переменной cursor
в моей программе с помощью gdb, это {kind = CXCursor_NoDeclFound, xdata = 0, data = {0x0, 0x0, 0x0}}
. Но все работает нормально, если я генерирую файл AST для helloworld.cpp
и использую clang_createTranslationUnit()
вместо clang_createTranslationUnitFromSourceFile()
.
Я что-то не так делаю или clang_createTranslationUnitFromSourceFile()
не поддерживает синтаксический анализ кода C ++? Моя версия clang 8.0.0