Pergunta

Até onde eu sei, apenas a Convenção de Clear-Clean-Stack pode usar argumentos variáveis.
A propósito, o Winapi Stringcchprintfw é declarado assim. (Removei o SAL)

__inLine hResult __stdcall
Stringcchprintfw (
StrSafe_lpwstr pszdest, size_t cchdest, strsafe_lpcwstr pszformat, ...
);

O stdcall também pode ter argumentos variáveis?

Foi útil?

Solução

Não stdcall A Convenção de Chamada faz com que o Callee limpe a pilha. Como o Callee está limpando a pilha, não há como saber no momento da compilação quanto sair, portanto, ela não pode ter argumentos variáveis.

Para ter um número variável de argumentos de função que você precisa usar CDECL, que faz o chamador limpar a pilha. Todo o compilador para determinar quantos argumentos estão sendo aprovados e, como o chamador está limpando a pilha, ele também sabe quanto sair da pilha quando a chamada para a função retornar.

No caso mencionado acima, a função é declarada usar __stdcall, que, como mencionado anteriormente, não suporta argumentos variáveis. Nesse caso, o compilador toma a decisão de ignorar a convenção de chamada definida e reverter para __cdecl. Este comportamento é mencionado na descrição para stdcall, Mencionado acima. Eu cito:

O Callee limpa a pilha, para que o compilador faça vararg funções __cdecl.

Isso pode ser observado se o código a seguir for compilado e uma chamada para a função desmontada.

int __stdcall Bar(int a, int b, ...)
{
  return b * a;
}

O código resultante será tratado como __cdecl. Quanto ao razão Isso é definido dessa maneira, eu não sei.

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