如何使用 libclang 加速解析 C++ 代码?
How to speed up parsing C++ code using libclang?
我有一个项目必须在原始编译之前进行解析。出于反思目的需要它。简而言之,我想检查编辑过的 .h
文件中的某些代码属性,并收集有关它的信息以生成特定的包含文件。
例如可反射的 classes/fields/methods 将被标记为 META(parameters...)
。这个宏将这样定义 #define META(...) __attribute__(annotate("reflectable"))
.
代码应如下所示(类似于 Qt QObject 或 Unreal Engine 4):
1.
// --- macros outside of header to parse ---
// Marks declaration as reflectable (with some metadata), empty for base compiler, useful for clang
#ifdef __clang__
#define META(...) __attribute__(annotate("reflectable"))
#else
#define META(...)
#endif
// Injects some generated code after parsing step, empty for clang, useful for base compiler
#ifdef __clang__
#define GENERATED_REFLECTION_INFO
#else
#define GENERATED_REFLECTION_INFO GENERATE_CODE(__FILE__, __LINE__)
#endif
// --- reflectable class ---
META(Serializable, Exposed, etc)
class MyReflectableClass : public BaseReflectableClass
{
GENERATED_REFLECTION_INFO
public:
// Fields examples
META()
int32 MyReflectableField;
META(SkipSerialize)
float MySecondaryReflectableField;
// Methods example
META(RemoteMethod)
void MyReflectableMethod(int32 Param1, uint8 Param2);
};
libclang 用于此目的。但是当项目包含 <string>
或 <memory>
时,它会导致标准库中长链依赖项的长时间解析。
如果项目有很多headers,也会发生类似的情况。
如何避免解析完整的标准库?可能是我可以在 libclang 中使用的某种缓存?
或者可能有一些方法可以跳过对这些包含的分析并让解析器相信未知类型是可以接受的?
那么如何优化应用程序以减少解析时间?
C++ 作为一种语言,由于 type-dependent 解析,不太适合推测性解析。例如,<
标记可能具有不同的含义,具体取决于它前面是否有模板。
但是,libclang supports precompiled headers,它让你缓存标准库headers。
我有一个项目必须在原始编译之前进行解析。出于反思目的需要它。简而言之,我想检查编辑过的 .h
文件中的某些代码属性,并收集有关它的信息以生成特定的包含文件。
例如可反射的 classes/fields/methods 将被标记为 META(parameters...)
。这个宏将这样定义 #define META(...) __attribute__(annotate("reflectable"))
.
代码应如下所示(类似于 Qt QObject 或 Unreal Engine 4):
1.
// --- macros outside of header to parse ---
// Marks declaration as reflectable (with some metadata), empty for base compiler, useful for clang
#ifdef __clang__
#define META(...) __attribute__(annotate("reflectable"))
#else
#define META(...)
#endif
// Injects some generated code after parsing step, empty for clang, useful for base compiler
#ifdef __clang__
#define GENERATED_REFLECTION_INFO
#else
#define GENERATED_REFLECTION_INFO GENERATE_CODE(__FILE__, __LINE__)
#endif
// --- reflectable class ---
META(Serializable, Exposed, etc)
class MyReflectableClass : public BaseReflectableClass
{
GENERATED_REFLECTION_INFO
public:
// Fields examples
META()
int32 MyReflectableField;
META(SkipSerialize)
float MySecondaryReflectableField;
// Methods example
META(RemoteMethod)
void MyReflectableMethod(int32 Param1, uint8 Param2);
};
libclang 用于此目的。但是当项目包含 <string>
或 <memory>
时,它会导致标准库中长链依赖项的长时间解析。
如果项目有很多headers,也会发生类似的情况。
如何避免解析完整的标准库?可能是我可以在 libclang 中使用的某种缓存?
或者可能有一些方法可以跳过对这些包含的分析并让解析器相信未知类型是可以接受的?
那么如何优化应用程序以减少解析时间?
C++ 作为一种语言,由于 type-dependent 解析,不太适合推测性解析。例如,<
标记可能具有不同的含义,具体取决于它前面是否有模板。
但是,libclang supports precompiled headers,它让你缓存标准库headers。