【问题标题】:How to speed up parsing C++ code using libclang?如何使用 libclang 加速解析 C++ 代码?
【发布时间】:2020-08-02 13:21:06
【问题描述】:

我有一个必须在原始编译之前解析的项目。出于反射目的需要它。简而言之,我想检查已编辑的 .h 文件中代码中的某些属性并收集有关它的信息以生成特定的包含文件。 例如,可反射的类/字段/方法将被标记为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> 之类的内容时,会导致标准库中长长的依赖链解析时间过长。

另外,如果项目有很多header,也会出现类似的情况。

如何避免解析完整的标准库?可能是我可以在 libclang 中使用的某种缓存?

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

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

【问题讨论】:

  • 我认为这需要更多关于您需要准确和有帮助地回答的预处理程度的信息。
  • @bitmask “预处理的范围”是什么意思?我通过代码示例添加了一些关于使用目的的信息。

标签: c++ parsing clang abstract-syntax-tree libclang


【解决方案1】:

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

不过,libclang supports precompiled headers,可以让您缓存标准库头文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多