컴파일 시 경고를 표시하도록 "정적 경고"를 구현할 수 있나요?
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 2
Clang 3.1:
warning: '_' is deprecated: Failed with 1 and 2 ...
결론
제시된 매크로는 컴파일 오류를 일으키지 않고 경고를 내보내는 static_warning 기능을 구현하는 방법입니다. 컴파일하는 동안 복잡한 템플릿 전문화를 디버깅하고 추적하는 데 유용한 도구입니다.
위 내용은 C에서 `static_assert`와 같은 컴파일 타임 경고를 내보낼 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!