> 백엔드 개발 > C++ > C에서 `static_assert`와 같은 컴파일 타임 경고를 내보낼 수 있나요?

C에서 `static_assert`와 같은 컴파일 타임 경고를 내보낼 수 있나요?

Linda Hamilton
풀어 주다: 2024-11-02 18:47:02
원래의
455명이 탐색했습니다.

Can We Emit Compile-Time Warnings Like `static_assert` in C  ?

컴파일 시 경고를 표시하도록 "정적 경고"를 구현할 수 있나요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿