SORU
26 Mayıs 2010, ÇARŞAMBA


snprintf ve Visual Studio 2010

Sıkışmış bir proje için VS 2010 kullanarak talihsiz olduğumu ve aşağıdaki kodu hala Kullanımı Sigara standartlarına uyumlu derleyici: inşa etmez fark ettim

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char buffer[512];

    snprintf(buffer, sizeof(buffer), "SomeString");

    return 0;
}

(hata ile derleme başarısız: C3861: '': tanımlayıcı bulunamadı) snprintf

Bu durumda geri dönüş yolu VS 2005 ile hatırlıyorum ve hala tamir edilmemiş görmek için şok oldum.

Herhangi bir Microsoft 2010 yılı içine standart C kütüphaneleri taşımak için herhangi bir planları olup olmadığını biliyor mu?

CEVAP
3 Ocak 2012, Salı


Kısa hikaye:Microsoft son olarak 2015 Visual Studio snprintf hayata geçirdi. Aşağıdaki gibi kullanabilirsiniz önceki sürümlerde bunu taklit.


Uzun versiyon:

Burada snprintf için beklenen davranış:

int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );

Bir tampon için en fazla 5 yazar ** karakter. Sonuç karakter string bir null karakteri ile, sürece iptal edilecektir buf_size sıfır. Eğer buf_size sıfırsa, hiçbir şey yazılır ve buffer boş gösterici olabilir. Dönüş değeri sayısıdır yazılmış karakterleri buf_sizesınırsız olmalı sonlandırıcı boş karakter hariç.

Sürümleri Visual Studio 2015 için önce uyumlu bir uygulama yoktu. Orada yerine standart olmayan uzantılar gibi _snprintf() (yok yazma null terminator taşması) ve _snprintf_s() (hangi olabilir zorlamak boş sonlandırma, ama -1 değerini döndürür taşması yerine sayıda karakter olurdu yazılı).

Ve VS 2005 için geri dönüş önerilen:

#if defined(_MSC_VER) && _MSC_VER < 1900

#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf

inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
    int count = -1;

    if (size != 0)
        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
    if (count == -1)
        count = _vscprintf(format, ap);

    return count;
}

inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
    int count;
    va_list ap;

    va_start(ap, format);
    count = c99_vsnprintf(outBuf, size, format, ap);
    va_end(ap);

    return count;
}

#endif

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011