Estado global no CRT

Algumas funções no UCRT (Universal C Runtime) usam o estado global. Por exemplo, setlocale() define a localidade de todo o programa, que afeta os separadores de dígitos, a página de código de texto e assim por diante.

O estado global do UCRT não é compartilhado entre aplicativos e o sistema operacional. Por exemplo, se o aplicativo setlocale()chamar , ele não afetará a localidade de nenhum componente do sistema operacional que usa o tempo de run-time C ou o contrário.

Versões específicas do sistema operacional de funções CRT

No UCRT, as funções que interagem com o estado global têm uma função "gêmeo", prefixada com _o_. Por exemplo:

  • setlocale() afeta o estado global específico do aplicativo.
  • _o_setlocale() afeta o estado global compartilhado por todos os componentes do sistema operacional, mas não por aplicativos.

A única diferença entre essas funções "gêmeos" é que, quando leem/escrevem o estado CRT global, as versões específicas do sistema operacional (ou seja, _o_as versões que começam com ) usam a cópia do sistema operacional do estado global em vez da cópia do estado global do aplicativo.

As versões específicas do sistema operacional dessas funções estão em ucrt.osmode.lib. Por exemplo, a versão específica do sistema operacional do setlocale() é _o_setlocale()

Há duas maneiras de isolar o estado CRT do componente do estado CRT de um aplicativo:

  • Vincule estaticamente o componente usando opções do /MT compilador (versão) ou /MTd (depuração). Para obter detalhes, consulte /MD, /MT, /LD. A vinculação estática pode aumentar muito o tamanho binário.
  • A partir Windows versões do Windows 10 versão 2004, vincule dinamicamente ao CRT, mas chame as exportações do modo do sistema operacional (as funções que começam com o). Para chamar as exportações do modo do sistema operacional, vincule estaticamente como antes, mas ignore o UCRT estático usando a opção de vinculador /NODEFAULTLIB:libucrt.lib (versão) /NODEFAULTLIB:libucrtd.lib ou (depuração). E adicione ucrt.osmode.lib à entrada do vinculador. Consulte /NODEFAULTLIB (Ignorar bibliotecas) para obter detalhes.

Observação

No código-fonte, escreva setlocale(), não _o_setlocale(). Quando você vincular ao ucrt.osmode.lib, o linker substituirá automaticamente a versão específica do sistema operacional da função. Ou seja, setlocale() será substituído por _o_setlocale().

A vinculação em ucrt.osmode.lib relação a desabilita algumas chamadas UCRT que só estão disponíveis no modo de aplicativo. Tentar chamá-los resultará em um erro de link.

Estado global afetado pela separação de aplicativo/so

O estado global afetado pela separação do aplicativo e do estado do sistema operacional inclui:

Consulte também

Referência da biblioteca Run-Time C