2016-01-24 182 views
0

在ODB(C++持久性库)上,#pragma db正在用于反射等,但它不是标准或特定于编译器的指令。我可以添加自定义#pragma规则吗?

#pragma db object 
class person 
{ 
    ... 
private: 
    friend class odb::access; 
    person() {} 

    #pragma db id 
    string email_; 

    string name_; 
    unsigned short age_; 
}; 

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

+0

您无法为代码添加自定义的#pragma支持。它由预处理器处理。 –

+2

当你有编译器的源代码时,你可以添加任何你想要的东西。调用它是一个编译器,它是一个预处理器。 –

+0

好的...那么,ODB如何使用'#pragma db'?一般来说,定义一个新的预处理器指令不能在用户级使用。 – LeeGom

回答

0

由于这不是标准的#pragma,它实际上是由ODB的预处理程序消耗的,该处理程序为“真正的编译程序”分配处理过的C++代码。

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

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

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

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

+0

最后,我应该选择破解编译器或编写假的编译器(为实际编译器吐出C++代码)。不是吗? – LeeGom

+0

是的,这两个之一。哪一个更好取决于你想要达到的目标,以及在预处理阶段这是否可能,或者你实际上需要在稍后阶段将编译指示与代码绑定。很明显,如果不理解你想要实现的是什么,就不可能说哪个更好。我会看看pragma如何在叮当中工作,看看我的另一个想法是否可行 - 但这不是我一直在努力的工作,而且可能需要一段时间才能弄清楚。 –

+0

好的,谢谢! – LeeGom

0

一般来说,no:您无法定义或重新定义#pragma s或其参数。但是,如果您愿意修改编译器和预处理器的源代码,则可以添加各种功能。如果你有源代码,这是一个中等复杂的任务。

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

相关问题