Páginas

domingo, 28 de outubro de 2012

[C++] Lista de argumentos com tamanho variável


Nem todas as linguagens de programação permitem criar sub-rotinas com o número variável de parâmetros.  Entretanto, C/C++ permitem a criação deste tipo de sub-rotina. Para isso, utiliza-se reticências (...) em um protótipo de uma função que pode receber um número variável de argumentos não importando seus tipos. Deve-se notar que as reticências devem ser colocadas no final da lista de argumentos. Macros e definições do cabeçalho de argumentos variáveis <cstdarg> são utilizados para se obter os recursos necessários para a construção deste tipo de função.

A função soma desenvolvida utiliza todas as definições de macros do cabeçalho <cstdarg>. O objeto lista, do tipo va_list, é utilizado pelas macros va_start, va_arg e va_end para processar a lista de argumentos da função soma.

Macros:
  • va_list: tipo utilizado para armazenar informações para as macros va_arg e va_end. É necessário declarar um objeto do tipo va_list para acessar os argumentos de uma lista de argumentos de tamanho variável.
  • va_start: macro chamada antes que seja possível acessar os argumentos da lista de tamanho variável. Esta macro inicializa o objeto declaro com va_list.
  • va_arg: esta macro é expandida para uma expressão de valor e tipo do próximo argumento da lista. Sempre que invocada, esta macro irá modificar o objeto declarado com va_list para que seja apontado para o próximo objeto da lista.
  • va_end: utilizada para facilitar o retorno de uma função cuja a lista de argumentos tenha sido referenciada por va_start.

Exemplo:


#include <iostream>
#include <cstdarg>

using std::cout;
using std::endl;

int soma(int, ...);

int main(int argc, char** argv) {

        int x = 1, y = 2, z = 3;

cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "z = " << z << endl;

cout << "A soma de x e y é: " << soma(2, x, y) << endl;
cout << "A soma de x, y e z é: " << soma(3, x, y, z) << endl;

return 0;
}

int soma(int i, ...) {

int total = 0;
va_list lista;

va_start(lista, i);

for (int j = 1; j <= i; j++)
total += va_arg(lista, int);

va_end(lista);

return total;
}

Resultado:
x = 1
y = 2
z = 3
A soma de x e y é: 3
A soma de x, y e z é: 6

É isso, divirtam-se.

Nenhum comentário:

Postar um comentário