Aracılığıyla paylaş


init_seg

C++ özel

Hangi başlangıç kodu yürütülür sırasını etkiler bir anahtar sözcük veya kod bölümü belirtir.

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

Notlar

Terimlerin anlamına segment ve bölüm bu konudaki değiştirilemez.

Kod yürütme başlatma genel statik nesneler içerebildiğinden, nesnelerin oluşturulması olduğunda tanımlayan bir anahtar belirtmeniz gerekir. Kullanmak özellikle önemlidir init_seg dinamik bağlantı kitaplıkları (DLL) içindeki pragma veya başlatma gerektiren kitaplıkları.

Seçenekler init_seg pragma şunlardır:

  • Derleyici
    Microsoft c Çalışma Zamanı Kitaplığı başlatma için ayrılmıştır. Bu gruptaki nesneleri önce oluşturulur.

  • lib
    Sınıf kitaplığı üçüncü taraf satıcıların başlatmaları için kullanılabilir. Bu gruptaki nesneleri olarak işaretlenenler sonra oluşturulmuş Derleyici , ancak tüm diğerleri önce.

  • kullanıcı
    Herhangi bir kullanıcı için kullanılabilir. Son olarak bu gruptaki nesneleri oluşturulur.

  • Bölüm adı
    Başlatma bölümünün açık belirtim sağlar. Kullanıcı tanımlı nesneleri bölüm adı örtük olarak oluşturulur değil; Ancak, adreslerini tarafından adlı bölümüne yerleştirilir bölüm adı.

    Size bölüm adı pragma sonra o modülünde bildirilen genel nesneler oluşturmak yardımcı işlevlerini işaretçiler içerir.

    Değil kullanmalısınız bir bölümü oluştururken, adları listesi için bkz: /SECTION.

  • işlev adı
    Bir işlevi yerine çağrılacak belirtir atexit ne zaman programından çıkar. Ayrıca bu yardımcı işlevini çağırır atexit ile yıkıcı global nesnesi için bir işaretçi. Form pragma içinde bir işlev tanımlayıcısını belirtirseniz,

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

    c Çalışma Zamanı Kitaplığı yerine 's işlevinizde çağrılacak sonra atexit. Bu nesneleri yok etmek hazır olduğunuzda adlı gerekecek yıkıcı listesi oluşturmanıza olanak sağlar.

(Örneğin, gelen bir dll) başlatma erteleme gerekiyorsa, bölüm adını açıkça belirtmek seçin. Daha sonra statik her nesne için Kurucular çağırması gerekir.

Hiçbir tanımlayıcısını tırnak vardır atexit değiştirme.

Nesneleriniz formunda diğer XXX_seg bilgi tarafından tanımlanan bölümlerde yine de yerleştirilecek.

c çalışma zamanı tarafından modülünde bildirilen nesneler otomatik olarak başlatılmayacak. O kendiniz yapmanız gerekir.

Varsayılan olarak, init_seg bölümler yalnızca okunur. Bölüm adı ise.crt, derleyici sessizce değiştirir, salt okunur özniteliği okundu olarak işaretlenmiş olsa bile yazabilirsiniz.

Belirttiğiniz olamaz init_seg çeviri birimi içinde birden fazla.

Nesneniz kodda açıkça tanımlanmış bir kurucu bir kullanıcı tanımlı oluşturucusu yok bile derleyici birini (örneğin tablo v işaretçiler bağlamak) oluşmasına neden olabilir. Bu nedenle, kodunuzun derleyicinin ürettiði kurucusunu çağırmak zorunda kalırsınız.

Örnek

// 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();
}
  

Ayrıca bkz.

Başvuru

Pragma yönergeleri ve anahtar sözcük __Pragma