對此是否[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. C++:重寫純虛擬成員變量?
- 6. 通過字節數組構造虛擬函數的結構是否安全?
- 7. 有條件成員函數
- 8. 默認情況下是虛擬的成員函數嗎?
- 9. C++從父虛擬成員調用子虛擬成員
- 10. 集成安全Windows Azure虛擬機
- 11. 虛擬函數比函數指針更安全嗎?
- 12. 編譯時和運行時虛擬和非虛函數(C++)
- 13. 從基類指針調用派生類非虛擬成員函數
- 14. 語法虛擬成員
- 15. 演員派生虛擬覆蓋基地純虛擬成員
- 16. 什麼是非靜態成員函數?
- 17. 沒有虛擬構造函數但是虛擬析構函數
- 18. 非虛擬地使用虛擬繼承函數?
- 19. 虛擬基類數據成員
- 20. 成員函數非對象
- 21. 非成員函數模板
- 22. 非虛擬調用Objective-C函數
- 23. 將非會員非朋友函數加入到成員函數
- 24. 在虛擬方法上使用OpCodes.Call是否安全?
- 25. 虛擬函數是否引用C++中派生類中的變量是否安全?
- 26. 是否是setlocale線程安全函數?
- 27. 如何在C++中正確使用虛擬成員函數
- 28. 具有相同名稱的虛擬成員函數的繼承
- 29. 多態性/繼承問題與虛擬類的成員函數
- 30. C++成員函數的虛擬覆蓋和過載,同時
「二元安全」是什麼意思?您當然必須使用完全相同的宏定義來編譯*所有*代碼。 – 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