HOW TO: Utilizzare # pragma init_seg per creazione statici di controllo

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 104248
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sommario
Nel compilatore Microsoft c ++, è possibile al controllo quando gli oggetti statici, dichiarati in ambito file, sono creati ed eliminati utilizzando la direttiva del preprocessore di #pragama init_seg.

ULTERIORI INFORMAZIONI

Esistono quattro opzioni per la direttiva del preprocessore init_seg: del compilatore, lib, utente e "user_defined_segment_name." Nel codice sorgente, questa direttiva potrebbe avere la forma:
   #pragma init_seg(compiler)   #pragma init_seg(lib)   #pragma init_seg(user)   #pragma init_seg("user_defined_segment_name")				
Nota: solo una direttiva di init_seg può essere visualizzati in un unico file sorgente. In caso contrario, il compilatore genera "Errore C2356: segmento di inizializzazione non deve cambiare durante la conversione unità."

Lo scopo di questa direttiva è per consentire allo sviluppatore per raggruppare i costruttori in un'applicazione. Questo potrebbe essere utile se alcuni oggetti è ritenuto l'esistenza di altri oggetti per il corretto funzionamento. Gli oggetti sono raggruppati tra loro utilizzando # pragma init_seg(compiler) vengono creati prima di tutti gli altri oggetti ed eliminati dopo tutti gli altri oggetti nell'applicazione. Viene utilizzato per gli oggetti le librerie di runtime. Ad esempio, poiché il cin e cout può o potrebbe non essere costruiti ancora, utilizzando questi oggetti nel costruttore o distruttore che utilizza il init_seg(compiler) # pragma sarà invece consigliabile.

Gli oggetti sono raggruppati tra loro utilizzando # pragma init_seg(lib) vengono costruiti dopo ed eliminati prima gli oggetti nei moduli compilati con # pragma init_seg(compiler), ma prima di tutti gli altri oggetti nell'applicazione. Gli oggetti sono raggruppati tra loro utilizzando # pragma init_seg(user) vengono costruiti dopo ed eliminati prima gli oggetti nei moduli compilati con # pragma init_seg(compiler) e init_seg(lib) # pragma. In altre parole, gli oggetti del sono raggruppati tra loro utilizzando # pragma init_seg(user) vengono costruiti ed eliminati contemporaneamente tutti gli altri oggetti statici che non sono state raggruppate utilizzando # pragma init_seg.

La documentazione non è completamente chiara su questo punto. Indicato che gli oggetti gruppo utenti vengono costruiti ultima. Ciò significa che tali oggetti vengono creati dopo ed eliminati prima i gruppi del compilatore e lib. Uno dei metodi che è possibile controllare l'ordine di creazione e distruzione all'interno di ogni gruppo consiste nel modificare l'ordine di collegamento. I moduli visualizzati precedente nella riga del collegamento verranno creati dopo ed eliminati prima i moduli visualizzati in un secondo momento nella riga del collegamento nello stesso gruppo init_seg. I costruttori sono denominati in ordine inverso di in segmenti l'aspetto.

È importante tenere presente che il linguaggio c ++ non garantisce un ordine di costruzione per gli oggetti nonderived, il linguaggio c ++ garantisce che tali oggetti verranno creati e che le classi base verranno create prima le classi che derivano da essi.

La direttiva del preprocessore init_seg("user_defined_segment_name") di # pragma inserisce gli indirizzi dei costruttori in segmento logico "user_defined_segment_name". Questa opzione è utile solo se si modifica il codice di avvio per chiamare i costruttori.

Nell'esempio di codice seguente (quattro file di origine) viene illustrato le idee precedente. Dopo aver compilato tutti i file di origine, è possibile collegarle nei due modi illustrato di seguito ed eseguire gli eseguibili risultanti. Le opzioni di init_seg dipendono dall'ordine dei collegamenti e che non sono, verrà visualizzato l'output di ciascuna.

Con le versioni di Visual c ++ 32-bit Edition, utilizzare:
   link file1 file2 file3 file4 /out:demo1.exe   link file4 file3 file2 file1 /out:demo2.exe				
versioni con Visual c ++ 16 bit, utilizzare:
   link file1 file2 file3 file4, demo1;   link file4 file3 file2 file1, demo2;				

Codice di esempio

// file1.cpp// command line: cl /c file1.cpp#pragma init_seg(compiler)#include<stdio.h>class MyCompClass{public:      MyCompClass(){ printf("In the ctor of MyCompClass\n");}      ~MyCompClass(){ printf("In the dtor of MyCompClass\n");}} MyComp;// file2.cpp// command line: cl /c file2.cpp#pragma init_seg(lib)#include<iostream.h>class MyLibClass{public:      MyLibClass(){cout<<"In the ctor of MyLibClass"<<endl;}      ~MyLibClass(){cout<<"In the dtor of MyLibClass"<<endl;}} MyLib;// file3.cpp// command line: cl /c file3.cpp#pragma init_seg(user)#include<iostream.h>class MyUserClass{public:      MyUserClass(){cout<<"In the ctor of MyUserClass"<<endl;}      ~MyUserClass(){cout<<"In the dtor of MyUserClass"<<endl;}} MyUser;// file4.cpp// command line: cl /c file4.cpp#include<iostream.h>class MyRegularClass{public:      MyRegularClass(){cout<<"In the ctor of MyRegularClass"<<endl;}      ~MyRegularClass(){cout<<"In the dtor of MyRegularClass"<<endl;}} MyRegular;void main(){}				
7.00 7.00a 8.00

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 104248 - Ultima revisione: 12/04/2015 09:43:39 - Revisione: 3.1

Microsoft Visual C++ 1.0 Professional Edition, Microsoft Visual C++ 1.5 Professional Edition, Microsoft Visual C++ 1.0 Professional Edition, Microsoft Visual C++ 2.0 Professional Edition, Microsoft Visual C++ 2.1, Microsoft Visual C++ 4.0 Standard Edition, Microsoft Visual C++ 5.0 Standard Edition, Microsoft Visual C++ 6.0 Service Pack 5

  • kbnosurvey kbarchive kbmt kbcode kbhowto kbhowtomaster kblangcpp KB104248 KbMtit
Feedback