我有一个项目,必须在原始编译之前进行解析。 它是用来反射的。 简而言之,我希望检查编辑过的.h
文件中代码中的一些属性,并收集有关它的信息以生成特定的include文件。 例如,可反射的类/字段/方法将标记为元(参数。。。)
。 此宏的定义如下#define META(。。。) __attribute__(注释(“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。 但是当项目包含诸如
或
之类的内容时,会导致对标准库中的长依赖项链进行长时间的解析。
而且如果项目有很多头,类似的情况也会发生。
如何避免解析全标准库? 可能是一些我可以在libclang中使用的缓存?
或者可能有一些方法可以跳过对这些包含的分析,并使解析器相信未知类型是可以接受的?
那么如何优化应用程序以减少解析时间呢?
C++,作为一种语言,由于依赖于类型的解析,不太适合于推测性解析。 例如,<
标记可能具有不同的含义,这取决于它前面是否有模板。
但是,libclang支持预编译头,这允许您缓存标准库头。