Entre os tipos de função fornecidos por esse idioma estão as funções "variadic". Esses tipos de função têm a flexibilidade de conter um número dinâmico ou variável de argumentos de entrada.
Nisso Linux Dica artigo, o va_arg Macro, que é um componente básico desse tipo de função e é usado para recuperar os dados dos argumentos de entrada, é explicado em detalhes.
Veremos uma explicação detalhada de sua operação e sintaxe. Em seguida, colocaremos o que aprendemos em prática em um exemplo prático, onde criaremos uma função variada passo a passo com fragmentos e imagens de código que mostram como o va_arg Macro funciona na linguagem C.
VA_ARG Macro sintaxe
Tipo va_arg (va_list AP, tipo)Definição de uma função variádica
Antes de entrarmos em mais detalhes sobre a macro va_arg, Vamos dar uma olhada rápida no que é uma função variada.
Essas funções não têm um número fixo de argumentos de entrada, mas o número desses argumentos é adaptado ao que o programador envia com cada chamada.
Um exemplo disso é a função variada amplamente usada printf (), cujos argumentos de entrada podem ser apenas uma string, uma string e uma variável, ou um ponteiro, ou vários deles.
Em seguida, veremos como definir uma função variada:
Função de tipo (variável de tipo,…);Como vemos na definição, ao criar uma função desse tipo, devemos especificar em sua declaração pelo menos um argumento de entrada declarado e seu tipo, seguido por um elipse separado por vírgula representando os argumentos variáveis ou desconhecidos.
As variáveis e macros que usam as funções variádicas, como va_arg, são definidos no “stdarg.H ”cabeçalho. Então, para usá -los, precisamos incluí -los em nosso “.Código C ”ou seu cabeçalho da seguinte forma:
#incluirEm seguida, vamos olhar em detalhes sobre o que as macros que compõem a função variádica são sobre.
Argumentos de entrada e macros de uma função variada
Nas funções variádicas, vários tipos de macros e variáveis são usados para processar os argumentos de entrada que o programador envia com cada chamada. Essas macros e seu uso na função são mostradas abaixo.
va_list apO objeto AP é do tipo Va_list e armazena informações sobre os argumentos de entrada. Em seguida, aponta para a posição atual na ordem de recuperação dos dados de entrada da lista.
Uma vez declarado, o objeto Va_list deve ser inicializado com a macro Va_start.
void va_start (va_list ap, último);A macro va_start é chamada primeiro quando uma função variá é chamada. Ele inicializa o objeto AP que aponta para o primeiro argumento desconhecido na lista.
TIPO VA_ARG (VA_LIST AP, TIPO);Esta macro retorna o próximo argumento de entrada apontado por AP da lista de argumentos. O tipo de dados retornado é especificado no tipo.
Assim que Va_arg recupera os dados, a AP incrementa seu valor pela referência ao próximo argumento de entrada.
Esta macro não retorna um valor padrão indicando que a lista de argumentos de entrada chegou. Portanto, o programador deve garantir que seja gerado um método seguro que indique se ainda existem argumentos na lista que podem ser extraídos ou não.
Um método seguro consiste em incluir, em cada chamada para a função variádica, um valor constante e exclusivo que pode ser interpretado no corpo da função como um indicador de "Não há mais parâmetros restantes" no último parâmetro de entrada.
void va_end (va_list ap);Depois que todos os argumentos foram recuperados, cada ciclo de Va_start deve ser encerrado com Va_end antes que a função variada retorne. Caso contrário, há informações sobre a pilha com os dados da chamada atual, o que pode levar a erros na próxima chamada da função
Já vimos cada uma das macros que fazem parte da recuperação de argumentos em uma função variádica. Agora, vamos ver um exemplo de como o uso do va_arg Macro para recuperar dados dos argumentos de entrada é implementado nesse tipo de função.
Como criar uma função variada passo a passo e recuperar seus argumentos de entrada com a macro va_arg () na linguagem C
Neste exemplo, explicamos passo a passo como criar uma função variádica e recuperar seus argumentos de entrada - usando a macro va_arg.
Na primeira etapa, criamos a função variádica, que chamaremos de get_arguments ().
Tanto a saída quanto o argumento de entrada declarada arg_1 será do tipo duplo. A declaração será assim:
duplo get_arguments (duplo arg_1,…);Depois de declarar a função com seus tipos de saída e entrada, continuamos com o desenvolvimento do corpo da função.
Na próxima etapa, criaremos uma matriz de 10 elementos do tipo duplo com o nome get_arg. Nesta matriz, armazenaremos os dados do argumento de entrada, que recuperaremos com a macro va_arg.
Também criaremos a variável "A", que é do tipo int e servirá como um identificador para os elementos da matriz get_arg.
duplo get_arg [10];Na próxima etapa, criamos um objeto do tipo va_list, que chamaremos de "AP".
Este objeto é inicializado com a macro va_start e passa como primeiro argumento, o nome do objeto criado anteriormente 'AP'; E como segundo argumento, o nome da última variável de entrada conhecida, neste caso "arg_1".
va_list ap;É importante observar que o primeiro argumento e, neste caso, o único conhecido pela função, não está incluído na lista "AP"; portanto, sua recuperação é feita da mesma maneira que para uma função não varívida.
Nesse caso, o armazenamos no elemento número 1 da matriz get_arg.
get_arg [a] = r1;Em seguida, crie um pouco de loop para recuperar os argumentos de entrada com a macro va_arg.
Neste loop, repita isso até que a macro va_arg obtenha o valor -1 ou "e", que será o indicador para o "último argumento".
Em cada ciclo do loop, a mensagem “Argumento recuperado:” é impresso pela função printf (), seguida pelo valor dos dados recuperados.
Então, o identificador “A” é incrementado por 1 e a macro va_arg é chamado, que recupera o próximo argumento de entrada e o armazena no elemento da matriz get_arg referenciado por "a".
while (get_arg [a] != e)Quando todos os dados foram recuperados e o programa saiu do loop, devemos sair do objeto da lista "AP" que criamos no início da função com a macro va_end e passar o nome desse objeto como argumento de entrada.
va_end (AP);Em seguida, veremos o código completo para a função variádica que acabamos de criar e o principal para chamar a função e declarar as variáveis do tipo duplo que enviaremos como argumentos de entrada.
#incluirA imagem abaixo mostra o console de comando com os argumentos de entrada recuperados. Nesse caso, a função foi chamada com dois argumentos de entrada.
Os dados recuperados para uma chamada com cinco argumentos de entrada.
Problemas e soluções para recuperar dados de entrada com o va_arg Macro
O principal problema que encontraremos no desenvolvimento de uma função variádica é que a macro va_arg não tem método para informar o programador do final da lista de argumentos de entrada. Então, uma vez que todos os dados enviados na chamada forem recuperados, esta macro retornará resultados errôneos toda vez que forem chamados indefinidamente
Isso significa que você não apenas obterá resultados incorretos, mas nos casos em que a recuperação de dados for em loop, haverá um transbordamento. Portanto, o programador deve criar um método para detectar o fim dos argumentos na lista. Um dos métodos pode ser usar uma constante como o último argumento que indica o fim da lista.
Outro método é especificar como o primeiro argumento, o número de parâmetros a serem enviados sempre que a função variada é chamada.
Conclusão
Neste lINUX DINT Artigo, damos a você uma explicação detalhada e completa de como as funções variadas funcionam e como usar o va_arg macro na linguagem C.
Também explicamos detalhadamente o uso de outras macros que fazem parte da recuperação de dados nesse tipo de função e mostrou -se passo a passo como declarar e desenvolver um deles, que é um recurso muito importante neste e em outras linguagens de programação. Você pode encontrar mais artigos como este no mecanismo de busca de dica do Linux.