2013-10-24 5 views
2

Я использую последний LibClang для анализа некоторых файлов заголовков C. Процесс кода I происходит из CXUnsavedFile (все это генерируется динамически и ничего не живет на диске). Например:LibClang: проанализировать файл заголовка с определениями из другого файла заголовка?

FileA.h содержит:

struct STRUCT_A { 
    int a; 
    struct STRUCT_B foo; 
}; 

FileB.h содержит:

struct STRUCT_B { 
    int b; 
}; 

При анализе fileA.h со следующим фрагментом кода:

CXUnsavedFile unsaved_files[2]; 

unsaved_files[0].Filename = "fileA.h"; 
unsaved_files[0].Contents = fileA_contents; 
unsaved_files[0].Length = strlen(fileA_contents); 

unsaved_files[1].Filename = "fileB.h"; 
unsaved_files[1].Contents = fileB_contents; 
unsaved_files[1].Length = strlen(fileB_contents); 

tu = clang_parseTranslationUnit(
    index, 
    "fileA.h", 
    argv, // "-x c-header -target i386-pc-win32" 
    argc, 
    (CXUnsavedFile *)&unsaved_files, 
    2, 
    CXTranslationUnit_None 
); 

CXCursor cur = clang_getTranslationUnitCursor(tu); 

clang_visitChildren(cur, visitor, NULL); 

I получите ошибку «field has incomplete type 'struct STRUCT_B'», которая имеет смысл, поскольку я не включил файлB.h, чтобы определить struct STR UCT_B.

Добавление "#include <fileB.h>" не работает (fatal error: 'fileB.h' file not found).

Как получить парсинг fileA.h для работы, когда одно или несколько необходимых определений присутствуют в другом файле CXUnsavedFileB.h?

+0

Ну, если 'fileA.h' зависит от' fileB.h', почему бы просто не переключить порядок файлов? –

ответ

3

Не уверен, что это поможет, но вот два замечания:

  1. Хотя не упоминается в документации, я думаю, что Filename поле должно содержать полный путь к файлу (что может быть важно для включений, особенно, когда есть «-I» переключатели в командной строке)

  2. из libclang's documentation (курсив):

    const char* CXUnsavedFile::Filename


    файл, содержимое которого еще не были сохранены. Этот файл должен быть уже в файловой системе.

    Я подозреваю libclang опирается на файловой системе для почти всех (то есть найти правильный файл, чтобы включить, проверить существует, ...) и только счет для CXUnsavedFile с на последнем этапе, когда фактическое содержание должно быть прочитано ,

Если вы можете, я бы предложил создать пустые файлы в файловой системе памяти. Это не приведет к большому использованию ресурсов и может помочь libclang найти нужные файлы.

+0

Спасибо, да, включив полный путь, например «c: \\ fileA.h» и передав директорию в командной строке «-Ic: \\», мы можем ссылаться на несохраненные файлы, включив их как ожидалось. – QAZ