對此是否[binary]安全?編寫非虛擬條件成員函數是否安全?
struct Foo { #if __cplusplus > 199711L Foo(std::initializer_list<int> & list) { /* ... */ } #endif };
我見過this topic, 但是OP原來的問題不回答。
有沒有更好的方法來實現這種行爲?
回答
它可能很好,DirectX結構以這種方式實現,但它支持C和C++。
雖然不知道「二進制」部分。 – 2012-07-27 15:21:30
我認爲你:
有這樣的代碼被編譯到庫中,已經升級你的編譯器(S),現在想和編譯代碼C++ 11(或不能因爲你沒有代碼),或者,
在C++ 11之前的庫中已經有代碼,現在您已經升級了要使用上述代碼的編譯器並且「兼容」與舊庫或
想編譯不使用C++ 11的代碼,並使用相同的編譯器將其與使用C++ 11編譯的代碼鏈接起來。
在每種情況下,答案是不是一個C++的問題,相反,它是一個編譯器ABI的問題,因爲它涉及的鏈接階段是否(ⅰ)將工作和(ii)運行時的形式類,等等在編譯器/版本/編譯器設置之間仍然有效。
因此,您需要檢查您正在使用的編譯器的文檔以確定其是否「二進制安全」。
注意#1:如果您的編譯器已經(/已)以任何方式更改了發出的代碼設計,類的RTTI佈局和/或名稱修改方案的異常,那麼您的答案是, 「不,這不安全。」但這些可能不是唯一的情況。
注2:如果是使用相同的編譯器和不同的設置(例如,用C++ 11和沒有),那麼你在技術上違反了ODR(一個定義規則)假設當你爲某些模塊排除代碼並在同一計劃中爲其他人提供。在這種情況下,結果在技術上是由實現定義的,但是由於它不是虛擬的,所以只有在使用一個版本的編譯器的情況下,才能與大多數編譯器一起工作。
- 1. 成員函數默認是虛擬的
- 2. 虛擬非方法成員
- 3. 「只有非靜態成員函數可以是虛擬的」
- 4. 在虛擬析構函數中調用其他虛擬方法是否安全?
- 5. 使用非虛擬析構函數從類中私下繼承是否安全?
- 6. 指向虛擬成員函數的指針是否可比?
- 7. 非虛擬成員的虛擬和繼承成本?
- 8. 虛擬成員函數的必要性
- 9. 繼承和虛擬成員函數
- 10. 指針到虛擬成員函數
- 11. 線程虛擬成員函數
- 12. 從基地調用非虛擬成員函數
- 13. 尋找成員函數倍率(非虛擬的)的C++溶液
- 14. 在C++中掛鉤非虛擬成員函數
- 15. 如何訪問類中的非虛擬私有成員函數?
- 16. 重載函數(虛擬/非虛擬)
- 17. 非虛重載成員函數
- 18. 編譯器允許忽略非虛擬私有成員函數嗎?
- 19. 以C++編寫的虛擬函數
- 20. std :: wstring_convert線程的成員函數是否安全?
- 21. 如果後代類沒有非靜態成員或析構函數,我是否需要虛擬析構函數?
- 22. 虛擬函數是否覆蓋基類中同名的非虛函數?
- 23. 訪問虛擬成員函數的編譯代碼
- 24. C++:重寫純虛擬成員變量?
- 25. 通過字節數組構造虛擬函數的結構是否安全?
- 26. 有條件成員函數
- 27. 默認情況下是虛擬的成員函數嗎?
- 28. C++從父虛擬成員調用子虛擬成員
- 29. 集成安全Windows Azure虛擬機
- 30. 派生類的成員函數是否繼承了基類的虛擬性?
「二元安全」是什麼意思?您當然必須使用完全相同的宏定義來編譯*所有*代碼。 – 2012-07-27 15:26:07
@KerrekSB如果用戶沒有使用-std = C++ 11編譯其應用程序,那麼使用-std = C++ 11編譯的庫僅在條件內聯成員函數中使用C++ 11功能將不起作用。 – 2012-07-27 15:29:48
就語言標準而言,它絕對是不合格的。這裏有一個[我的相關問題](http://stackoverflow.com/questions/10717106/can-different-gcc-dialects-be-linked-together)。 – 2012-07-27 15:34:57