Can I Implement a "Static Warning" to Emit Warnings at Compile Time?
Static_assert in C 11 is a valuable tool for identifying errors at compile time. However, it only generates compilation errors, not warnings. This question explores the possibility of implementing a "static_warning" that emits warnings instead of aborting compilation.
Possible Implementation Using Macros
Drawing inspiration from Michael E's comment, a sophisticated solution is proposed using macros:
<code class="cpp">#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg))) // GCC #define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo // MSVC</code>
Additional macros are introduced to facilitate the creation of static warnings:
<code class="cpp">#define STATIC_WARNING(cond, msg) ... #define STATIC_WARNING_TEMPLATE(token, cond, msg) ...</code>
Usage Examples
The macros can be employed at various scopes:
<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>
Output in Different Compilers
Compiling the example code with various compilers generates warnings as expected:
GCC 4.6:
warning: ‘void static_warning1::_(const detail::false_type&)’ is deprecated ...
Visual C 2010:
warning C4996: 'static_warning1::_': Failed with 1 and 2
Clang 3.1:
warning: '_' is deprecated: Failed with 1 and 2 ...
Conclusion
The presented macros provide a sophisticated approach to implementing a static_warning feature that emits warnings rather than causing compilation errors. It is a useful tool for debugging and tracing complex template specializations during compilation.
The above is the detailed content of Can We Emit Compile-Time Warnings Like `static_assert` in C ?. For more information, please follow other related articles on the PHP Chinese website!