2012-07-27 75 views
0
  1. 對此是否[binary]安全?編寫非虛擬條件成員函數是否安全?

    struct Foo { 
    
        #if __cplusplus > 199711L 
         Foo(std::initializer_list<int> & list) { 
          /* ... */ 
         } 
        #endif 
    
    }; 
    

    我見過this topic, 但是OP原來的問題不回答。

  2. 有沒有更好的方法來實現這種行爲?

+0

「二元安全」是什麼意思?您當然必須使用完全相同的宏定義來編譯*所有*代碼。 – 2012-07-27 15:26:07

+0

@KerrekSB如果用戶沒有使用-std = C++ 11編譯其應用程序,那麼使用-std = C++ 11編譯的庫僅在條件內聯成員函數中使用C++ 11功能將不起作用。 – 2012-07-27 15:29:48

+1

就語言標準而言,它絕對是不合格的。這裏有一個[我的相關問題](http://stackoverflow.com/questions/10717106/can-different-gcc-dialects-be-linked-together)。 – 2012-07-27 15:34:57

回答

0

它可能很好,DirectX結構以這種方式實現,但它支持C和C++。

+0

雖然不知道「二進制」部分。 – 2012-07-27 15:21:30

0

我認爲你:

  • 有這樣的代碼被編譯到庫中,已經升級你的編譯器(S),現在想和編譯代碼C++ 11(或不能因爲你沒有代碼),或者,

  • 在C++ 11之前的庫中已經有代碼,現在您已經升級了要使用上述代碼的編譯器並且「兼容」與舊庫或

  • 想編譯不使用C++ 11的代碼,並使用相同的編譯器將其與使用C++ 11編譯的代碼鏈接起來。

在每種情況下,答案是不是一個C++的問題,相反,它是一個編譯器ABI的問題,因爲它涉及的鏈接階段是否(ⅰ)將工作和(ii)運行時的形式類,等等在編譯器/版本/編譯器設置之間仍然有效。

因此,您需要檢查您正在使用的編譯器的文檔以確定其是否「二進制安全」。

注意#1:如果您的編譯器已經(/已)以任何方式更改了發出的代碼設計,類的RTTI佈局和/或名稱修改方案的異常,那麼您的答案是, 「不,這不安全。」但這些可能不是唯一的情況。

注2:如果是使用相同的編譯器和不同的設置(例如,用C++ 11和沒有),那麼你在技術上違反了ODR(一個定義規則)假設當你爲某些模塊排除代碼並在同一計劃中爲其他人提供。在這種情況下,結果在技術上是由實現定義的,但是由於它不是虛擬的,所以只有在使用一個版本的編譯器的情況下,才能與大多數編譯器一起工作。