다음을 통해 공유


init_seg

특정 C++

에 시작 코드가 실행 되는 순서에 영향을 하는 키워드 또는 코드 섹션을 지정 합니다.

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]} )

설명

약관의 의미 세그먼트 및 섹션 이 항목의 상호 교환이 가능 합니다.

전역 정적 개체를 초기화 실행 코드를 포함할 수 있기 때문에 개체가 생성 될 때 정의 하는 키워드를 지정 해야 합니다.사용 하는 것은 특히 중요의 init_seg pragma에서 동적 연결 라이브러리 (Dll) 또는 라이브러리 초기화를 필요로 합니다.

옵션에는 init_seg 는 pragma:

  • 컴파일러
    Microsoft C 런타임 라이브러리 초기화를 위해 예약 되어 있습니다.이 그룹의 개체는 먼저 생성 됩니다.

  • lib
    클래스 라이브러리는 타사 공급 업체의 초기화가 사용할 수 있습니다.이 그룹의 개체 이름으로 표시 된 후 생성 된 컴파일러 전에 다른 위치에 있습니다.

  • 사용자(User)
    모든 사용자가 사용할 수 있습니다.이 그룹의 개체를 마지막으로 생성 됩니다.

  • 섹션 이름
    초기화 섹션에 명시적으로 지정 수 있습니다.사용자 지정 개체 섹션 이름 암시적으로 생성 됩니다. 그러나 해당 주소 명명 섹션에 배치 됩니다 섹션 이름.

    제공 된 섹션 이름을 pragma 뒤 해당 모듈에 선언 된 전역 개체를 생성 하는 도우미 함수에 대 한 포인터가 포함 됩니다.

    이름 사용 하면 안 된 섹션을 만들 때 목록을 참조 하십시오. /SECTION.

  • 기능 이름
    대신에 호출 하는 함수를 지정 합니다. atexit 때 프로그램을 종료 합니다.이 도우미 함수를 호출 하는 atexit 전역 개체에 대 한 소멸자에 대 한 포인터가 있습니다.폼의 pragma를 함수 식별자를 지정 하는 경우

    int __cdecl myexit (void (__cdecl *pf)(void))
    

    C 런타임 라이브러리 대신의 호출 될 함수를 다음 atexit.이 개체를 삭제 하려면 준비가 되었을 때 호출 하는 데 필요한 소멸자 목록을 만들 수 있습니다.

(예: DLL)의 초기화를 지연 하는 경우 구역 이름을 명시적으로 지정할 수 있습니다.그런 다음 각 정적 개체에 대 한 생성자를 호출 해야 합니다.

가지 없음에 대 한 식별자를 따옴표로 atexit 대체 합니다.

개체를 다른 XXX_seg 프로그램에서 정의 하는 섹션에도 배치 됩니다.

모듈에 선언 된 개체를 C 런타임으로 자동으로 초기화 되지 않습니다.해당 작업을 직접 수행 해야 합니다.

기본적으로 init_seg 절만 읽습니다.구역 이름을 경우.CRT를 컴파일러 자동으로 변경 됩니다 특성 읽기 전용, 읽은 상태로 표시 되는 경우에 기록 됩니다.

지정할 수 없습니다. init_seg 번역 단위에서 두 번 추가 합니다.

개체에서 사용자 정의 생성자를 코드에서 명시적으로 정의 하는 생성자가 없는 경우에 컴파일러의 포인터 v-table 바인딩하는 데 하나를 생성할 수 있습니다.따라서 코드를 컴파일러에서 생성 된 생성자를 호출 해야 합니다.

예제

// pragma_directive_init_seg.cpp
#include <stdio.h>
#pragma warning(disable : 4075)

typedef void (__cdecl *PF)(void);
int cxpf = 0;   // number of destructors we need to call
PF pfx[200];    // pointers to destructors.

int myexit (PF pf) {
   pfx[cxpf++] = pf;
   return 0;
}

struct A {
   A() { puts("A()"); }
   ~A() { puts("~A()"); }
};

// ctor & dtor called by CRT startup code 
// because this is before the pragma init_seg
A aaaa; 

// The order here is important.
// Section names must be 8 characters or less.
// The sections with the same name before the $
// are merged into one section. The order that
// they are merged is determined by sorting
// the characters after the $.
// InitSegStart and InitSegEnd are used to set
// boundaries so we can find the real functions
// that we need to call for initialization.

#pragma section(".mine$a", read)
__declspec(allocate(".mine$a")) const PF InitSegStart = (PF)1;

#pragma section(".mine$z",read)
__declspec(allocate(".mine$z")) const PF InitSegEnd = (PF)1;

// The comparison for 0 is important.
// For now, each section is 256 bytes. When they
// are merged, they are padded with zeros. You
// can't depend on the section being 256 bytes, but
// you can depend on it being padded with zeros.

void InitializeObjects () {
   const PF *x = &InitSegStart;
   for (++x ; x < &InitSegEnd ; ++x)
      if (*x) (*x)();
}

void DestroyObjects () {
   while (cxpf>0) {
      --cxpf;
      (pfx[cxpf])();
   }
}

// by default, goes into a read only section
#pragma init_seg(".mine$m", myexit)

A bbbb; 
A cccc;

int main () {
   InitializeObjects();
   DestroyObjects();
}
  

참고 항목

참조

Pragma 지시문과 __Pragma 키워드