>  기사  >  백엔드 개발  >  C에서 정적 멤버를 자동으로 강제 초기화하는 방법은 무엇입니까?

C에서 정적 멤버를 자동으로 강제 초기화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-28 05:04:02605검색

How to Force Initialization of Static Members Automatically in C  ?

정적 멤버를 자동으로 강제 초기화하는 방법

C의 정적 멤버는 필요한 방식으로 사용되지 않는 한 자동으로 초기화되지 않습니다. 존재한다는 정의. 이 동작은 때때로 불편할 수 있으며, 특히 정적 멤버 초기화 중에 부작용을 수행하려는 경우에는 더욱 그렇습니다.

다음 예를 고려하십시오.

<code class="cpp">template<class D>
char register_(){
    return D::get_dummy(); // static function
}

template<class D>
struct Foo{
    static char const dummy;
};

template<class D>
char const Foo<D>::dummy = register_<D>();

struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return 42; }
};</code>

이 예에서는 더미가 Bar와 함께 Foo의 구체적인 인스턴스화가 발생하자마자 초기화됩니다. 그러나 정적 멤버의 지연 초기화 동작으로 인해 그렇지 않습니다.

Bar 또는 Foo 인스턴스 없이 더미를 강제로 초기화하려면 다음 기술 중 하나를 사용할 수 있습니다.

  • 파생 클래스에 템플릿 특수화 사용: 이 기술에는 파생 클래스에 대한 템플릿 클래스의 특수화를 만들고 해당 특수화에서 정적 멤버를 수동으로 초기화하는 작업이 포함됩니다.
<code class="cpp">template<class D>
struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return (void)dummy; return 42; }
};</code>
  • 템플릿 구조체를 사용하여 강제 초기화: 이 기술에는 템플릿 구조체의 멤버 변수를 통해 정적 멤버를 강제로 초기화하는 템플릿 구조체를 만드는 작업이 포함됩니다.
<code class="cpp">template<typename T, T> struct value { };

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  typedef value<int&, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;</code>
  • Enum 익명 공용체와 함께 템플릿 구조체 사용: 이 기술은 이전 기술과 유사하지만 익명 공용체를 사용하여 정적 구조체의 초기화를 강제합니다.
<code class="cpp">template<typename T, T> struct var { enum { value }; };
typedef char user;

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  static int b; // and this

  // hope you like the syntax!
  user :var<int&, a>::value,
       :var<int&, b>::value;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;

template<typename T>
int HasStatics<T>::b = /* whatever side-effect you want */ 0;</code>

이러한 기술을 사용하면 사용자 개입이나 파생 클래스 수정 없이 정적 멤버를 강제로 초기화할 수 있습니다. 사용할 특정 기술은 특정 요구 사항 및 코딩 스타일 기본 설정에 따라 다릅니다.

위 내용은 C에서 정적 멤버를 자동으로 강제 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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