Portanto, tenho 2 funções com argumentos semelhantes
void example(int a, int b, ...);
void exampleB(int b, ...);
Agora example
chama exampleB
, mas como posso passar as variáveis na lista de argumentos de variáveis sem modificar exampleB
(já que isso já é usado em outro lugar também).
c++
variadic-functions
Não disponível
fonte
fonte
Respostas:
Você não pode fazer isso diretamente; você tem que criar uma função que leva a
va_list
:fonte
, ...
na assinatura. Se você converteu os argumentos das variáveis em ava_list
, pode passar ova_list
para outra função que recebe apenas ava_list
, mas essa função (ou uma que ela chama) deve ter alguma maneira de saber o que está dentro dova_list
.Talvez jogar uma pedra em um lago aqui, mas parece funcionar muito bem com modelos variáveis C ++ 11:
No mínimo, funciona com
g++
.fonte
args...
você deve criar versões dessas funções que pegam uma va_list e as aprovar. Veja
vprintf
como um exemplo:fonte
Eu também queria embrulhar printf e encontrei uma resposta útil aqui:
Como passar um número variável de argumentos para printf / sprintf
Eu não estava nem um pouco interessado em desempenho (tenho certeza que este pedaço de código pode ser melhorado de várias maneiras, fique à vontade para fazer isso :)), isso é apenas para depuração geral, então fiz o seguinte:
que eu então posso usar assim
Os ostreams C ++ são bonitos em alguns aspectos, mas praticamente se tornam horríveis se você quiser imprimir algo assim com algumas pequenas strings como parênteses, dois pontos e vírgulas inseridos entre os números.
fonte
A propósito, muitas implementações C têm uma variação interna v? Printf que IMHO deveria ter feito parte do padrão C. Os detalhes exatos variam, mas uma implementação típica aceitará uma estrutura contendo um ponteiro de função de saída de caractere e informações dizendo o que deve acontecer. Isso permite que printf, sprintf e fprintf usem o mesmo mecanismo de 'núcleo'. Por exemplo, vsprintf pode ser algo como:
A função core_printf então chama p_inf-> func para cada caractere a ser gerado; a função de saída pode então enviar os caracteres para o console, um arquivo, uma string ou outra coisa. Se a implementação de alguém expõe a função core_printf (e qualquer mecanismo de configuração que ela usa), pode-se estendê-la com todos os tipos de variações.
fonte
Uma maneira possível é usar #define:
fonte
Com base no comentário que você está redigindo
vsprintf
e que está marcado como C ++, sugiro que não tente fazer isso, mas mude sua interface para usar iostreams C ++. Eles têm vantagens sobre aprint
linha de funções, como segurança de digitação e capacidade de imprimir itens queprintf
não dariam conta. Algum retrabalho agora pode evitar uma quantidade significativa de dor no futuro.fonte
Usando o novo padrão C ++ 0x, você pode conseguir fazer isso usando modelos variados ou até mesmo converter o código antigo para a nova sintaxe de modelo sem quebrar nada.
fonte
Esta é a única forma de o fazer .. e a melhor forma de o fazer também ..
fonte