> 백엔드 개발 > Golang > STL이나 Boost 라이브러리에 의존하지 않고 C에서 \'지연\' 기능을 어떻게 구현할 수 있습니까?

STL이나 Boost 라이브러리에 의존하지 않고 C에서 \'지연\' 기능을 어떻게 구현할 수 있습니까?

DDD
풀어 주다: 2024-11-01 22:32:29
원래의
411명이 탐색했습니다.

How can you implement a

C에서 "Defer" 기능의 사용자 정의 구현

C에서 "defer" 개념은 마지막에 특정 작업을 실행하는 것을 포함합니다. 특정 범위 또는 코드 블록의 STL(표준 템플릿 라이브러리) 및 Boost 라이브러리는 이 기능의 내장 구현을 제공하지 않지만 다음 코드 조각을 사용하여 사용자 정의 솔루션을 생성할 수 있습니다:

<code class="cpp">#ifndef defer
struct defer_dummy {};
template <class F> struct deferrer { F f; ~deferrer() { f(); } };
template <class F> deferrer<F> operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&amp;]()
#endif // defer</code>
로그인 후 복사

사용법:

defer 매크로는 특정 범위 내에서 해당 범위가 끝날 때 실행될 코드 블록을 정의하는 데 사용할 수 있습니다. 구문은 다음과 같습니다.

<code class="cpp">defer {
    // Code to be executed at the end of the current scope
};</code>
로그인 후 복사

예:

다음 예에서는 defer 매크로가 read_entire_file 함수 내에서 다음과 같은 경우 입력 파일을 자동으로 닫는 데 사용됩니다. 함수 종료:

<code class="cpp">#include <cstdlib>
#include <cstdio>

bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) {
    if (!filename)
        return false;

    auto file = std::fopen(filename, "rb");
    if (!file)
        return false;

    defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

    // ... Remaining code
}</code>
로그인 후 복사

이점:

  • 오버헤드 없음: 일부 다른 구현과 달리 이 접근 방식은 추가 오버헤드.
  • 구문적으로 간결함: 구문은 쉽게 읽고 사용할 수 있도록 설계되었습니다.
  • 의존성 없음: 이 구현은 모든 외부 라이브러리에서 컴파일 시간을 단축합니다.
  • 유연함: defer 블록에는 유효한 C 문이나 표현식이 포함될 수 있습니다.

참고:

  • 네임스페이스 오염을 방지하기 위해 로컬 연기자 개체의 이름은 _ 대신 zz_로 시작합니다.
  • 사용자 식별자는 기술적으로 밑줄로 시작하면 안 됩니다.

위 내용은 STL이나 Boost 라이브러리에 의존하지 않고 C에서 \'지연\' 기능을 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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