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

时间:2016-01-24 09:54:39

标签: c++

在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规则吗?

2 个答案:

答案 0 :(得分:0)

通常,不会:您无法定义或重新定义#pragma或其参数。

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

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

答案 1 :(得分:0)

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

你可以通过编写一个解析源代码并修改它的程序来做类似的事情。这不是你在五分钟内完成的事情,但是对于一些库(例如libclang),你可以可行地读取,处理和输出修改后的源代码,并将其发送给编译器。

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

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

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