C++ 中export 关键字的尴尬处境
分離編譯模式(Separate Compilation Model)允許在一處翻譯單元(Translation Unit)中定義(define)函數、類型、類對象等,在另一處翻譯單元引用它們。編譯器(Compiler)處理完所有翻譯單元后,鏈接器(Linker)接下來處理所有指向 extern 符號的引用,從而生成單一可執行文件。該模式使得 C++ 代碼編寫得稱心而優雅。
?????? 然而該模式卻馴不服模板(Template)。標準要求編譯器在實例化模板時必須在上下文中可以查看到其定義實體;而反過來,在看到實例化模板之前,編譯器對模板的定義體是不處理的——原因很簡單,編譯器怎么會預先知道 typename 實參是什么呢?因此模板的實例化與定義體必須放到同一翻譯單元中。
?????? 以優雅著稱的 C++ 是不能容忍有此“敗家仔兒”好好活著的。標準 C++ 為此制定了“模板分離編譯模式(Separation Model)”及 export 關鍵字。然而由于 template 語義本身的特殊性使得 export 在表現的時候性能很次。編譯器不得不像 .net 和?Java?所做的那樣,為模板實體生成一個“中間偽代碼(IPC,intermediate pseudo - code)”,使得其它翻譯單元在實例化時可找到定義體;而在遇到實例化時,根據指定的 typename 實參再將此 IPC 重新編譯一遍,從而達到“分離編譯”的目的。因此,該標準受到了幾乎所有知名編譯器供應商的強烈抵制。
?????? 誰支持 export 呢?Comeau C/C++?和 Intel 7.x 編譯器支持。而以“百分百支持 ISO ”著稱的 VS 和 GCC 卻對此視而不見。真不知道這兩大編譯器“百分百支持”的是哪個版本的 ISO。在 VS 2008 中,export 關鍵字在 IDE 中被標藍,表示 VS IDE 認識它,而編譯時,會用警告友情提示你“不支持該關鍵字”,而配套的 MSDN 9 中的 C++ keywords 頁則根本查不到該關鍵字;而在 VS 2010 中,就沒那么客氣了,盡管 IDE 中仍然會將之標藍,但卻會直截了當地報錯。呵呵,難道標藍就表示 VS “百分百支持標準”了么?呵呵……嘿嘿……哈哈哈哈……
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C++ 中export 关键字的尴尬处境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenTSDB 开发指南之 查询数据
- 下一篇: Hbase Compaction 源码分