Pergunta

Eu estou usando C (não C++) e eu não tenho certeza de como evitar o uso de variáveis globais.

Eu tenho uma boa compreensão sobre C, a sintaxe, e como escrever um aplicativo básico, mas não tenho certeza se de forma adequada para estruturar o programa.

Como realmente grandes aplicações, evitar o uso de variáveis globais?Eu tenho certeza de que haverá sempre necessidade de ser pelo menos alguns, mas para grandes jogos e outras aplicações escritas em C, qual é a melhor forma de o fazer?

Há boa, software open-source escrito estritamente em C que eu poderia olhar?Eu não posso pensar de qualquer cima da minha cabeça, mais eles parecem estar em C++.

Obrigado.

Editar

Aqui está um exemplo de onde eu gostaria de usar uma variável global em uma API simples de ligar o aplicativo, que é apenas uma DLL dentro de outro processo.

Esta aplicação, especificamente, ganchos funções de API usado em outro aplicativo.Ele faz isso usando WriteProcessMemory para substituir a chamada para o original, e fazer-lhe um convite para a minha DLL em vez disso.

No entanto, quando onuligar a função de API, eu tenho que escrever de volta a memória original/código de máquina.

Então, eu preciso para manter uma simples matriz de bytes para que o código de máquina, um para cada função de API que é viciado, e há um monte.

// Global variable to store original assembly code (6 bytes)
BYTE g_MessageBoxA[6];

// Hook the API function
HookAPIFunction ( "user32.dll", "MessageBoxA", MyNewFunction, g_MessageBoxA );

// Later on, unhook the function
UnHookAPIFunction ( "user32.dll", "MessageBoxA", g_MessageBoxA );

Desculpe se isso é confuso.

Foi útil?

Solução

"Como realmente grandes aplicações, evitar o uso de variáveis globais?"

  1. Usar variáveis estáticas.Se uma função precisa lembrar-se de algo entre chamadas, utilizar esta versus variáveis globais.Exemplo:

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
  2. A passagem de dados através de parâmetros, de modo que o valor é definido um lugar, talvez main() e passados para onde ela é necessária.

  3. Se tudo mais falhar, vá em frente e use global, mas tenta mitigar potenciais problemas.

    1. No mínimo, use as convenções de nomenclatura para minimizar o potencial de conflitos.Por exemplo: Gbl_MyApp_DeveloperName.Assim, todas as variáveis globais iniciar com o Gbl_MyApp_ parte-onde "MyApp" foi algo descritivo de seu aplicativo.
    2. Tente grupo de funções por fim, de modo que tudo o que precisa de uma dada global está no mesmo arquivo (dentro da razão).Em seguida, as variáveis globais podem ser definidas e restritas para que o arquivo (cuidado com o extern palavra-chave).

Outras dicas

Existem alguns usos válidos para variáveis globais.As escolas começaram a ensinar que eles foram mal para manter os programadores de ser preguiçoso e mais de usá-los.Se você tiver certeza de que os dados realmente globalmente necessário, em seguida, usá-los.Uma vez que você está preocupado em fazer um bom trabalho, eu acho que você não vai ir muito longe errado, usando o seu próprio julgamento.

É fácil - simplesmente não usá-los.criar o que teria ben variáveis globais na sua função main() e, em seguida, passá-los de lá, como parâmetros para as funções que precisam deles.

O melhor recomendado software de código fonte aberto para aprender C na minha faculdade tinha sido Linux, assim você pode obter exemplos de sua origem.

Eu penso o mesmo, globals são ruins, reduz a legibilidade e aumenta a possibilidade de erro e outros problemas.

Vou explicar-te o meu exemplo.Eu tenho um main() fazendo muito poucas coisas.A maioria da ação vem de temporizadores externos e interrupções.Estas são funções com parâmetro não, devido a plataforma que eu estou usando, 32 bits micro controlador.Eu não posso passar parâmetros e, além disso, estas interrupções e temporizadores são assíncronas.A maneira mais fácil é global, imaginar, interrupções preencher um buffer, esse buffer é analisado dentro de um timer, e as informações analisadas são usadas, armazenadas, enviadas em outros contadores.Ok, eu posso puxar um sinalizador de interrupção e de processo, em função principal, mas ao executar critical software que o caminho não é boa ideia.

Este é o único tipo de variável global que não me faça sentir mal ;-)

Variáveis globais são quase inevitáveis.No entanto, eles são, muitas vezes em demasia.Eles não são um substituto para a passagem de parâmetros adequados e elaboração das estruturas de dados.

Toda vez que você quiser uma variável global, pense:e se eu precisar de mais como esta?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top