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