이 질문은 static_assert와 유사한 정적 경고를 구현하는 메커니즘이 존재하는지 확인하려고 합니다. 그러나 컴파일을 중단하는 대신 컴파일 중에 경고 메시지가 표시됩니다.
Michael E의 의견에서 제공한 통찰력을 활용하여 다음 구현이 제안됩니다.
<code class="c++">#if defined(__GNUC__) #define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg))) #elif defined(_MSC_VER) #define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo #else #error This compiler is not supported #endif #define PP_CAT(x,y) PP_CAT1(x,y) #define PP_CAT1(x,y) x##y namespace detail { struct true_type {}; struct false_type {}; template <int test> struct converter : public true_type {}; template <> struct converter<0> : public false_type {}; } #define STATIC_WARNING(cond, msg) \ struct PP_CAT(static_warning,__LINE__) { \ DEPRECATE(void _(::detail::false_type const& ),msg) {}; \ void _(::detail::true_type const& ) {}; \ PP_CAT(static_warning,__LINE__)() {_(::detail::converter<(cond)>());} \ } // Note: using STATIC_WARNING_TEMPLATE changes the meaning of a program in a small way. // It introduces a member/variable declaration. This means at least one byte of space // in each structure/class instantiation. STATIC_WARNING should be preferred in any // non-template situation. // 'token' must be a program-wide unique identifier. #define STATIC_WARNING_TEMPLATE(token, cond, msg) \ STATIC_WARNING(cond, msg) PP_CAT(PP_CAT(_localvar_, token),__LINE__)</code>
매크로는 네임스페이스, 구조 및 기능을 포함한 여러 범위에서 호출될 수 있습니다. 예는 다음과 같습니다.
<code class="c++">#line 1 STATIC_WARNING(1==2, "Failed with 1 and 2"); STATIC_WARNING(1<2, "Succeeded with 1 and 2"); struct Foo { STATIC_WARNING(2==3, "2 and 3: oops"); STATIC_WARNING(2<3, "2 and 3 worked"); }; void func() { STATIC_WARNING(3==4, "Not so good on 3 and 4"); STATIC_WARNING(3<4, "3 and 4, check"); } template <typename T> struct wrap { typedef T type; STATIC_WARNING(4==5, "Bad with 4 and 5"); STATIC_WARNING(4<5, "Good on 4 and 5"); STATIC_WARNING_TEMPLATE(WRAP_WARNING1, 4==5, "A template warning"); }; template struct wrap<int>;</code>
적절한 컴파일러 경고가 활성화된 경우 제공된 구현은 컴파일 타임에 경고 메시지를 생성하여 지정된 메시지를 전달합니다.
GCC 4.6:
static_warning1::_: Failed with 1 and 2 Foo::static_warning6::_: 2 and 3: oops func()::static_warning12::_: Not so good on 3 and 4 wrap<T>::static_warning19::_: Bad with 4 and 5
Visual C 2010:
'static_warning1::_': Failed with 1 and 2 'Foo::static_warning6::_': 2 and 3: oops 'func::static_warning12::_': Not so good on 3 and 4 'wrap<T>::static_warning19::_': Bad with 4 and 5
Clang 3.1:
'_' is deprecated: Failed with 1 and 2 '_' is deprecated: 2 and 3: oops '_' is deprecated: Not so good on 3 and 4 '_' is deprecated: Bad with 4 and 5
위 내용은 컴파일을 중단하는 대신 경고를 생성하는 `static_assert`와 동일한 정적 경고가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!