我可以實現「靜態警告」以在編譯時發出警告嗎?
C 11 中的 Static_assert 是識別錯誤的寶貴工具在編譯時。但是,它只產生編譯錯誤,而不產生警告。這個問題探討了實作發出警告而不是中止編譯的「static_warning」的可能性。
使用宏的可能實現
從Michael E 的評論中汲取靈感,這是一個複雜的評論建議使用宏解決方案:
<code class="cpp">#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg))) // GCC #define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo // MSVC</code>
引入了其他巨集以方便建立靜態警告:
<code class="cpp">#define STATIC_WARNING(cond, msg) ... #define STATIC_WARNING_TEMPLATE(token, cond, msg) ...</code>
使用範例
這些巨集可以在各種範圍內使用:
<code class="cpp">STATIC_WARNING(1==2, "Failed with 1 and 2"); STATIC_WARNING(..., "2 and 3 worked"); struct Foo { STATIC_WARNING(..., "2 and 3: oops"); }; void func() { STATIC_WARNING(..., "Not so good on 3 and 4"); } template <typename T> struct wrap { STATIC_WARNING_TEMPLATE(WRAP_WARNING1, ..., "A template warning"); };</code>
不同編譯器中的輸出
使用各種編譯器編譯範例程式碼會如預期產生警告:
GCC 4.6:
warning: ‘void static_warning1::_(const detail::false_type&)’ is deprecated ...
Visual C 2010:
warning C4996: 'static_warning1::_': Failed with 1 and 2Visual C 2010:
>Clang 3.1:
warning: '_' is deprecated: Failed with 1 and 2 ...
結論
所提供的巨集提供了複雜的實作發出警告而不是導致編譯錯誤的static_warning 功能的方法。它是在編譯期間調試和追蹤複雜模板專業化的有用工具。以上是我們可以發出像 C 中的「static_assert」這樣的編譯時警告嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!