Tenho a infelicidade de estar preso ao uso do VS 2010 para um projeto e percebi que o código a seguir ainda não compila usando o compilador não compatível com os padrões:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(falha na compilação com o erro: C3861: 'snprintf': identificador não encontrado)
Lembro-me de ser esse o caso com o VS 2005 e estou chocado ao ver que ainda não foi corrigido.
Alguém sabe se a Microsoft tem planos de mover suas bibliotecas C padrão para o ano de 2010?
c
visual-studio-2010
Andrew
fonte
fonte
Respostas:
Breve história: A Microsoft finalmente implementou o snprintf no Visual Studio 2015. Em versões anteriores, você pode simular como a seguir.
Versão longa:
Aqui está o comportamento esperado para snprintf:
Versões anteriores ao Visual Studio 2015 não tinham uma implementação compatível. Em vez disso, existem extensões não padrão como
_snprintf()
(que não grava terminador nulo em overflow) e_snprintf_s()
(que pode impor terminação nula, mas retorna -1 em overflow em vez do número de caracteres que teriam sido gravados).Alternativa sugerida para VS 2005 e superior:
fonte
snprintf
não faz parte do C89. É padrão apenas no C99. A Microsoft não tem nenhum plano de suporte ao C99 .(Mas também é padrão em C ++ 0x ...!)
Veja outras respostas abaixo para uma solução alternativa.
fonte
_snprintf
é insegura e se comporta de maneira diferentesnprintf
(não adiciona necessariamente um terminador nulo), portanto, o conselho dado nesta resposta é enganoso e perigoso.Se você não precisa do valor de retorno, também pode definir snprintf como _snprintf_s
fonte
Eu acredito que o equivalente do Windows é
sprintf_s
fonte
sprintf_s
se comporta de maneira diferente desnprintf
.Outro substituto seguro
snprintf()
evsnprintf()
fornecido pelo ffmpeg. Você pode verificar a fonte aqui (sugerido).fonte
Tentei o código de @Valentin Milea, mas encontrei erros de violação de acesso. A única coisa que funcionou para mim foi a implementação do Insane Coding: http://asprintf.insanecoding.org/
Especificamente, estava trabalhando com código legado VC ++ 2008. Desde a implementação da Insane Coding (pode ser baixado a partir do link acima), eu usei três arquivos:
asprintf.c
,asprintf.h
evasprintf-msvc.c
. Outros arquivos eram para outras versões do MSVC.[EDITAR] Para ser completo, seus conteúdos são os seguintes:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Uso (parte
test.c
fornecida pela Insane Coding):fonte