Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Algumas funções no Universal C Runtime (UCRT) usam o estado global. Por exemplo, setlocale() define a localidade de todo o programa, o 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 seu aplicativo chamar setlocale(), isso não afetará o local de nenhum componente do sistema operativo que use o tempo de execução C, ou vice-versa.
Versões das funções CRT específicas para o SO
Na UCRT, as funções que interagem com o estado global têm uma função "gêmea", 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 pelos aplicativos.
A única diferença entre essas funções "gêmeas" é que, quando elas leem/gravam o estado CRT global, as versões específicas do sistema operacional (ou seja, as versões que começam com _o_) 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 operativo destas funções estão em ucrt.osmode.lib. Por exemplo, a versão específica do SO do setlocale() é _o_setlocale()
Há duas maneiras de isolar o estado CRT do componente do estado CRT de um aplicativo:
- Vincule estaticamente seu componente usando as opções
/MTdo compilador (release) ou/MTd(debug). Para obter detalhes, consulte /MD, /MT, /LD. A vinculação estática pode aumentar muito o tamanho binário. - A partir das versões do Windows que começam com o Windows 10 versão 2004, faça uma ligação dinâmica ao CRT, mas chame as exportações no modo do sistema operativo (as funções que começam com o). Para chamar as exportações do modo OS, ligue estaticamente como antes, mas ignore o UCRT estático usando a opção de linker
/NODEFAULTLIB:libucrt.lib(release) ou/NODEFAULTLIB:libucrtd.lib(debug). E adicioneucrt.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ê vincula o ucrt.osmode.lib, o vinculador 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 contra ucrt.osmode.lib desativa algumas chamadas UCRT que só estão disponíveis no modo de aplicativo. Tentar chamar essas funções resultará em um erro de link.
Estado global afetado pela separação de aplicativos/sistemas operacionais
O estado global afetado pela separação entre o estado do aplicativo e o estado do sistema operacional inclui:
- Dados de localidade
- Manipuladores de sinal definidos por
signal - Rotinas de rescisão definidas pela
terminate -
errnoe_doserrno - Estado de geração de números aleatórios usado por
randesrand - Funções que retornam um buffer que o usuário não precisa liberar:
strtok,wcstok,_mbstok
Tmpnam,_wtmpnam
asctime,_wasctime
gmtime,_gmtime32,_gmtime64
_fcvt
_ecvt
strerror,_strerror,_wcserror,__wcserror - O buffer usado por
_putch,_putwch -
_set_invalid_parameter_handler,_set_thread_local_invalid_parameter_handler -
_set_new_handlere_set_new_mode fmode- Informações de fuso horário