我使用最新的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?
答案 0 :(得分:3)
不确定这会对您有所帮助,但这里有两个评论:
虽然文档中没有明确提到,但我认为Filename
字段应该包含文件的完整路径(这对于包含很重要,特别是当有“-I”时) “在命令行中切换”
(强调我的):
const char* CXUnsavedFile::Filename
尚未保存内容的文件。 此文件必须已存在于文件系统中。
我怀疑libclang
依赖于几乎所有文件系统(找到要包含的正确文件,检查它是否存在,......)并且只在最后一步考虑CXUnsavedFile
s必须阅读内容。
如果可以,我建议在内存文件系统中创建空文件。这不会占用太多资源,可以帮助libclang
找到正确的包含文件。