clang_createTranslationUnitFromSourceFile () и исходный код C ++ - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь определить типы данных в исходном коде 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...