我可以添加自定义 #pragma 规则吗?

Can I add custom #pragma rule?

本文关键字:规则 #pragma 添加 自定义 我可以      更新时间:2023-10-16

在ODB(C++持久性库)上,#pragma db用于反射等,但它不是标准或特定于编译器的指令。

#pragma db object
class person
{
    ...
private:
    friend class odb::access;
    person () {}
    #pragma db id
    string email_;
    string name_;
    unsigned short age_;
};

我可以在 ODB 等编译器上添加自定义 #pragma 规则吗?

由于这不是一个标准的#pragma,它实际上被ODB的预处理器使用,它为"真正的编译器"吐出处理过的C++代码。

你可以做类似的事情,通过编写一个程序来解析源代码并对其进行修改。这不是你能在五分钟内破解的东西,但是使用一些库(如libclang),你可以有效地读取,处理和输出修改后的源代码,并将其发送到编译器。

要为编译器本身生成真正的#pragma,您必须修改编译器的源代码。

编辑:生成自己的支持自定义编译指示的完整编译器的一种相对轻量级的方法是从 clang 开始,然后构建自己的编译器驱动程序,或者修改cc1_main.cpp。

然后使用Preprocessor::addPragmaHandler()介绍您自己的编译指示。这将修改编译器,但实际上不必更改实际的编译器源代码 - 维护对实际编译器的更改比拥有应用于编译器源代码的公共接口的"插件"要困难得多。即使这些确实发生了变化,它也不像编译器源代码本身中的编译指示列表那样"繁忙"。

通常,否:不能定义或重新定义#pragma或其参数。

但是,如果您愿意修改编译器和预处理器的源代码,则可以添加各种功能。 如果您有源代码,这是一项中等复杂度的任务。

请注意,许多#pragma对应于命令行编译器选项:如果存在,则更容易实现。