提问者:小点点

如何使用libclang加快C++代码的解析速度?


我有一个项目,必须在原始编译之前进行解析。 它是用来反射的。 简而言之,我希望检查编辑过的.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中使用的缓存?

或者可能有一些方法可以跳过对这些包含的分析,并使解析器相信未知类型是可以接受的?

那么如何优化应用程序以减少解析时间呢?


共1个答案

匿名用户

C++,作为一种语言,由于依赖于类型的解析,不太适合于推测性解析。 例如,<标记可能具有不同的含义,这取决于它前面是否有模板。

但是,libclang支持预编译头,这允许您缓存标准库头。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(libclang|加快|c++|代码|解析|速度)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?