LibClang:用另一个头文件中的定义解析头文件?

时间:2013-10-24 16:15:08

标签: c clang libclang

我使用最新的LibClang来解析一些C头文件。我处理的代码来自CXUnsavedFile(它全部是动态生成的,没有任何东西存在于磁盘上)。例如:

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 );

我收到错误“field has incomplete type 'struct STRUCT_B'”这是有意义的,因为我没有包含fileB.h以定义struct STRUCT_B。

添加“#include< fileB.h>”不起作用(fatal error: 'fileB.h' file not found)。

当另一个CXUnsavedFile fileB.h中存在一个或多个所需定义时,如何解析fileA.h?

1 个答案:

答案 0 :(得分:3)

不确定这会对您有所帮助,但这里有两个评论:

  1. 虽然文档中没有明确提到,但我认为Filename字段应该包含文件的完整路径(这对于包含很重要,特别是当有“-I”时) “在命令行中切换”

  2. 来自libclang's documentation
  3. (强调我的):

      

    const char* CXUnsavedFile::Filename

         
         

    尚未保存内容的文件。   此文件必须已存在于文件系统中。

    我怀疑libclang依赖于几乎所有文件系统(找到要包含的正确文件,检查它是否存在,......)并且只在最后一步考虑CXUnsavedFile s必须阅读内容。

  4. 如果可以,我建议在内存文件系统中创建空文件。这不会占用太多资源,可以帮助libclang找到正确的包含文件。