Co oznacza "_"? Dlaczego Microsoft dodaje ten znak na początku?Dlaczego w msvC++ mamy _snprintf, podczas gdy inne kompilatory zezwalają na snprintf
Odpowiedz
Identyfikatory w globalnej przestrzeni nazw zaczynające się od _
są zarezerwowane dla implementacji. _snprintf
to tylko funkcja dostarczona przez implementację (Visual Studio). Jeśli chodzi o to uzasadnienie, Visual Studio implementuje C89, a snprintf
jest częścią późniejszego standardu C99.
Poza tym, semantyka obu funkcji są różne w typie powrotnej, która w snprintf
zawsze jest liczba znaków, że sformatowany ciąg trwa (czy nie było w buforze wystarczająco dużo miejsca, czy nie, natomiast _snprintf
powróci a. liczba ujemna jeśli nie ma w buforze wystarczająco dużo miejsca
Oznacza to, że aby przydzielić bufor wystarczająco duży dla wyjścia można zrobić:
int size = snprintf(0, 0, "%s %d\n", str, i);
char * buffer = malloc(size+1);
snprintf(buffer, size+1, "%s %d\n", str, i);
nie można tego zrobić z _snprintf
jako na ly informacją, że funkcja zwraca się z powrotem, jest to, że obecny rozmiar nie jest wystarczający.
snprintf()
nie był jeszcze częścią standardu w czasie, w którym środowisko wykonawcze C firmy Microsoft zaczęło go obsługiwać.
Ponieważ prototyp funkcji nie był ustandaryzowany, a programiści nie chcieli używać nazwy snprintf
(w przypadku, gdy standard określał później inny prototyp), zdecydowali się dodać wiodący znak podkreślenia oznaczający funkcję jako Microsoft rozszerzenie do standardu.
Dodając do powyższego
istnieje właściwa C99 snprintf()
i vsnprintf()
dostępny od Visual Studio 2015
i nawet nie wywołać znanego niebezpieczny ostrzeżenie funkcja amortyzacji.
_snprintf_s()
lub _vsnprintf_s()
, o ile zostały dostarczone, są "bezpiecznymi wariantami" funkcji specyficznych dla MSVC, z zachowaniem innym niż C99.
Oprócz innej wartości zwracanej w przypadku niewystarczająco dużego bufora (opisanego w odpowiedzi Davida), funkcje z grupy _sn...
różnią się od standardu snprintf
pod innym ważnym względem. Jeśli bufor docelowy jest za krótki tylko jednym znakiem, funkcje _sn...
uważają tę sytuację za "sukces".
Mówiąc bardziej szczegółowo, jeśli bufor cel jest na tyle długi, aby przechowywać całej sekwencji otrzymanej ale bez zakończenia zerowym postaci funkcje _sn...
nie skrócić wynik nie zapisu kończące zera do bufora docelowego i w rezultacie zwróć rozmiar bufora. Tak więc, w ogólnym przypadku wynik nie ma zagwarantowanego zerowania.
W tej samej sytuacji snprintf
odrzuci ostatni znak wynikowej sekwencji i na jego miejsce wypisze terminator zerowy. Wynik snprintf
jest zawsze zakończony zerem.
- 1. Dlaczego Shadow DOM, gdy mamy iframes?
- 2. Dlaczego używać kodowania CJSON, gdy mamy json_encode
- 3. Dlaczego setattr i getattr zezwalają na odstępy?
- 4. Dlaczego lua_tonumber() ma inne zachowanie od lua_tointeger(), gdy mamy do czynienia z dużą liczbą całkowitą?
- 5. Dlaczego powinniśmy używać zakodowanych ui, gdy mamy Specflow?
- 6. MIPS: Dlaczego potrzebujemy bajta obciążenia, gdy mamy już słowo load?
- 7. zamieszanie snprintf
- 8. Równoważne do _Countof MSVC w innych kompilatorach?
- 9. Dlaczego języki nie zezwalają na przeciążanie metod przez zwracaną wartość?
- 10. Dlaczego mamy niezmienną pustą mapę?
- 11. Dlaczego == operator przeciążenie enum dwuznaczne w MSVC
- 12. snprintf luka w zabezpieczeniach Format String problem
- 13. Dlaczego potrzebujemy `Zaimportowanych pakietów`, gdy mamy` Wymagane wtyczki` w zależnościach pluginów eclipse?
- 14. snprintf dla Windows CE
- 15. Wydajność strftime vs snprintf
- 16. Czy istnieje sposób na uzyskanie lepszych informacji w kontekście błędu podczas korzystania z msvc? (ex: C2248)
- 17. Dlaczego MSVC++ 11 odrzuca kwalifikację constexpr funkcji?
- 18. Przenośność pthreads-win32 przez różne kompilatory okien
- 19. snprintf i sprintf wyjaśnienie
- 20. Jak utworzyć wielokąt w JTS, gdy mamy listę współrzędnych?
- 21. Dlaczego Boolean :: New() zwraca uchwyt <>, podczas gdy inne prymitywy zwracają Local <>?
- 22. C++: typedefs oddzwonienia z __stdcall w MSVC
- 23. Czy mamy wzorce projektowe w C++, jakie mamy w java?
- 24. Dlaczego MSVC generuje C4127 ostrzeżenie, gdy stała jest używana w "a" - C
- 25. Kompilatory tłumaczące algorytmy weryfikacji na problemy SAT
- 26. Kompilatory JIT do matematyki
- 27. JavaScript "kompilatory"
- 28. __VA_ARGS__ ekspansja użyciu MSVC
- 29. Dlaczego mamy max. 256 kolorów w emulatorach terminali?
- 30. Błąd ODR w MSVC?