Artigo: 104248 - Última revisão: terça-feira, 5 de Julho de 2005 - Revisão: 3.1

COMO: Utilizar # pragma init_seg para construção estático do controlo

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

No compilador C++ de Microsoft, é possível controlar quando os objectos estáticos, declarados no âmbito do ficheiro, são construídos e destructed utilizando a directiva de pré-processador #pragama init_seg.

MAIS INFORMAÇÕES

Existem quatro opções para a directiva de pré-processador init_seg: compilador, lib, utilizador e "user_defined_segment_name." Em código, esta directiva teria o formulário:
   #pragma init_seg(compiler)
   #pragma init_seg(lib)
   #pragma init_seg(user)
   #pragma init_seg("user_defined_segment_name")
				
Nota: apenas uma directiva init_seg pode aparecer no ficheiro de origem único. Caso contrário, o compilador gera "erro C2356: segmento de inicialização não tem de alterar durante a conversão de unidade."

O objectivo desta directiva é permitem o programador para agrupar os construtores numa aplicação. Isto é útil se alguns objectos esperado a existência de outros objectos para funcionar correctamente. Objectos que estão agrupados em conjunto utilizando init_seg(compiler) # pragma são construídos antes de todos os outros objectos e destruídos depois de todos os outros objectos na aplicação. Isto é utilizado para objectos nas bibliotecas de tempo de execução. Por exemplo, dado que cin cout poderá e poderá não ser construído, utilizando estes objectos no construtor ou processo de destruição que utiliza o init_seg(compiler) # pragma seriam recomendável com o.

Objectos que estão agrupados em conjunto utilizando init_seg(lib) # pragma são construídos depois e destructed antes de objectos que estão em módulos compilados com # pragma init_seg(compiler), mas antes de todos os outros objectos na aplicação. Objectos que estão agrupados em conjunto utilizando init_seg(user) # pragma são construídos depois e destructed antes de objectos que estão em módulos compilados com # pragma init_seg(compiler) e # pragma init_seg(lib). Por outras palavras, objectos que estão agrupados em conjunto utilizando init_seg(user) # pragma são construídos e destructed ao mesmo tempo que todos os outros objectos estáticos que não foram agrupados utilizando # pragma init_seg.

A documentação não está totalmente simples neste ponto. Indica que os objectos no grupo de utilizadores são construídos pela última vez. Isto significa que estes objectos são criados depois de e destructed antes dos grupos de compilador e lib. Uma forma que pode controlar a ordem de construção e destruição dentro de cada grupo é alterar a ordem de ligação. Módulos que conste anteriormente na linha de ligação serão construídos depois e destructed antes de módulos que conste posteriormente na linha de ligação que estão no mesmo grupo de init_seg. Construtores denominam-se pela ordem inversa do respectivo aspecto nos segmentos.

É importante ter em atenção que a linguagem do C++ não garante qualquer ordem de construção de objectos nonderived; a linguagem do C++ garante que os objectos vão ser criados e que classes base irão ser criadas antes de classes que deriva-los.

A directiva de pré-processador # pragma init_seg("user_defined_segment_name") coloca os endereços dos construtores para o segmento lógico "user_defined_segment_name". Esta opção é útil apenas se modificar o código de arranque para chamar estes construtores.

O seguinte exemplo de código (quatro ficheiros de origem) demonstra as ideias acima. Depois de compilar todos os ficheiros de origem, ligá-las de duas formas apresentadas abaixo e executar executáveis resultante. A saída de cada um irá mostrar as opções que init_seg estão dependentes de ordem de ligação e que não estão.

Com versões do Visual C++ 32-bit Edition, utilize:
   link file1 file2 file3 file4 /out:demo1.exe
   link file4 file3 file2 file1 /out:demo2.exe
				
versões com Visual C++ 16 bits, utilize:
   link file1 file2 file3 file4, demo1;
   link file4 file3 file2 file1, demo2;
				

Código de exemplo

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

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbcode kbhowto kbhowtomaster kblangcpp KB104248 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 104248  (http://support.microsoft.com/kb/104248/en-us/ )
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.