2016-01-24 68 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對應於命令行編譯器選項:如果存在,則更容易實現。

相關問題