_environ, _wenviron
A variável de _environ é um ponteiro para um array de ponteiros para cadeias de caracteres de multibyte- caractere que constituem o ambiente do processo.Esta variável global foi substituído para o e versões mais seguros getenv_s, _wgetenv_s e _putenv_s, _wputenv_s, que devem ser usados no lugar de variável global._environ é declarado em Stdlib.h.
Importante |
---|
Este API não pode ser usado em aplicativos executados em Tempo de Execução do Windows.Para obter mais informações, consulte Funções de CRT não suportadas com /ZW. |
extern char **_environ;
Comentários
Em um programa que use a função de main , _environ é inicializado na inicialização do programa de acordo com as configurações leva de ambiente do sistema operacional.O ambiente consiste em uma ou mais entradas do formulário
ENVVARNAME=string
getenv_s e putenv_s usam a variável de _environ para acessar e modificar a tabela de ambiente.Quando _putenv é chamado para adicionar ou excluir configurações de ambiente, o tamanho das alterações de tabela de ambiente.Seu lugar na memória também pode mudar, dependendo dos requisitos de memória do programa.O valor de _environ é ajustado automaticamente de acordo.
A variável de _wenviron , declarado em Stdlib.h como:
extern wchar_t **_wenviron;
é uma versão de largo- caractere de _environ.Em um programa que use a função de wmain , _wenviron é inicializado na inicialização do programa de acordo com as configurações leva de ambiente do sistema operacional.
Em um programa que usa main, _wenviron é inicialmente NULL porque o ambiente é composta de cadeias de caracteres de multibyte- caractere.Na primeira chamada a _wgetenv ou a _wputenv, um ambiente correspondente da cadeia de caracteres de largo- caractere é criado e apontado por _wenviron.
Da mesma forma, em um programa que usa wmain, _environ é inicialmente NULL porque o ambiente é composta de cadeias de caracteres de largo- caractere.Na primeira chamada a _getenv ou a _putenv, um ambiente correspondente da cadeia de caracteres de multibyte- caractere é criado e apontado por _environ.
Quando duas cópias de ambiente (MBCS e Unicode) existem simultaneamente em um programa, o sistema de tempo de execução deve manter as duas cópias, resultando em um tempo de execução mais lentos.Por exemplo, sempre que você chama _putenv, uma chamada a _wputenv é executado também automaticamente, de modo que as duas cadeias de caracteres de ambiente coincidam.
Cuidado |
---|
Em instâncias raras, quando o sistema de tempo de execução está mantendo uma versão Unicode e uma versão de multibyte de ambiente, essas versões de dois ambientes podem não corresponder exatamente.Isso ocorre porque, embora os mapas exclusivos de cadeia de caracteres de multibyte- caracteres em uma cadeia de caracteres exclusiva Unicode, o mapeamento de uma cadeia de caracteres exclusiva Unicode para uma cadeia de caracteres de multibyte- caractere não são necessariamente exclusivos.Como consequência, duas cadeias de caracteres Unicode distintas pode mapear para a mesma cadeia de caracteres de multibyte. |
Eleição _environ em um contexto Unicode é sem-sentido quando /MD ou ligação do /MDd são usados.Para a DLL de CRT, o tipo (de largura ou multibyte) do programa é conhecido.Somente o tipo de multibyte é criado porque é o cenário mais provável.
O pseudo-código a seguir ilustra como isto pode acontecer.
int i, j;
i = _wputenv( "env_var_x=string1" ); // results in the implicit call:
// putenv ("env_var_z=string1")
j = _wputenv( "env_var_y=string2" ); // also results in implicit call:
// putenv("env_var_z=string2")
Na notação usada para esse exemplo, as cadeias de caracteres não são literais de cadeia de caracteres; C em vez disso, eles são espaços reservados que representam literais de cadeia de caracteres de ambiente Unicode na chamada de _wputenv e cadeias de caracteres de ambiente de multibyte na chamada de putenv .Os espaços reservados 'x' e 'y' de caracteres nas duas cadeias de caracteres de ambiente distintas Unicode não mapeiam exclusivamente para caracteres na atual MBCS.Em vez disso, ambos mapeiam para qualquer MBCS o caractere 'z' que é o resultado padrão da tentativa de converter cadeias de caracteres.
Assim, o ambiente de multibyte, o valor de “env_var_z” após a primeira chamada implícita para putenv seria “string1”, mas esse valor é substituído na segunda chamada implícita para putenv, quando o valor de “env_var_z” é definido como “string2”.O ambiente Unicode (em _wenviron) e o ambiente de multibyte (em _environ) difeririam como consequência seguindo esta série de chamadas.