>  기사  >  백엔드 개발  >  C에서 Golang 스타일 연기를 어떻게 달성할 수 있습니까?

C에서 Golang 스타일 연기를 어떻게 달성할 수 있습니까?

DDD
DDD원래의
2024-11-02 01:26:31531검색

How Can I Achieve Golang-Style Defer in C  ?

C의 Golang 스타일 연기 이해

소개:

C의 개념 Golang의 defer와 유사한 지연 실행 기능은 특정 함수가 반환되거나 종료된 후 코드를 실행하는 편리한 방법을 제공합니다.

STL 및 라이브러리 구현:

C 기준 14 이상에서는 STL(표준 템플릿 라이브러리) 또는 Boost와 같은 기타 라이브러리가 지연 실행 패턴의 직접적인 구현을 제공하지 않습니다. 그러나 이 기능을 구현하는 데 사용할 수 있는 여러 타사 라이브러리와 기술이 있습니다.

맞춤 구현:

제공된 코드 조각은 오버헤드가 없고 손쉬운 defer의 사용 구현:

<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{} *[&]()
#endif // defer</code>

사용법:

이 구현을 사용하려면 함수 다음에 실행하려는 코드 범위 앞에 defer를 배치하면 됩니다. 종료:

<code class="cpp">defer {
   // Code to be executed after the function returns
};</code>

예:

다음 예에서는 이 연기 구현을 사용하여 파일을 열고 읽는 방법을 보여 주며, 범위가 종료되면 자동으로 파일을 닫습니다. :

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

bool read_entire_file(char *filename, std::uint8_t *&data_out,
                      std::size_t *size_out = nullptr) {
    ...

    defer { std::fclose(file); }; // Automatically close the file

    ...
}</code>

장점:

이 구현은 다른 접근 방식에 비해 여러 가지 장점을 제공합니다.

  • 추가 런타임 없이 오버헤드가 발생하지 않습니다. 오버헤드
  • 구문적으로 더 간단하고 사용하기 쉬움
  • 의존성 제로, 컴파일 시간 단축
  • 코드베이스 어디든 쉽게 붙여넣기 가능

결론:

이 사용자 정의 defer 구현은 사용자 정의 클래스나 추가 종속성이 필요 없이 Golang의 defer 키워드와 유사한 기능을 제공하여 C에서 지연 실행을 달성하는 편리하고 효율적인 방법을 제공합니다.

위 내용은 C에서 Golang 스타일 연기를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.