2013-03-25 14 views
28

chcę wydrukować wartość size_t zmiennej używając printf w C++ z użyciem Microsoft Visual Studio 2010 (Chcę użyć printf zamiast << w tym szczególnym kawałek kodu, więc nie ma odpowiedzi opowiadaj mi, że powinienem użyć << zamiast) .Poprawny specyfikator formatu printf dla size_t:% zu lub% Iu?

Zgodnie z tym stanowiskiem

Platform independent size_t Format specifiers in c?

niezależny od platformy poprawne sposobem jest użycie %zu, ale to nie wydają się działać w Visual Studio. Dokumentacja Visual Studio w

http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

mówi mi, że muszę użyć %Iu (przy użyciu wielkich liter i, nie małe litery l).

Czy firma Microsoft nie przestrzega standardów tutaj? A może standard został zmieniony od C99? Czy standard różni się między C i C++ (co wydaje mi się bardzo dziwne)?

+6

strony MSDN jesteś podłączony do mówi: "Przedrostki modyfikatorów długości I, I32 i I64 są rozszerzeniami Microsoftu i nie są zgodne z ANSI", co wydaje się odpowiadać na twoje pytanie o MS spełniające standardy. –

+3

http://stackoverflow.com/questions/1546789/clean-code-to-printf-size-t-in-c-or-nearest-equivalent-of-c99s-z-in-c – Nima

Odpowiedz

3

Wystarczy, aby było jasne i powtórzyć to, co zostało powiedziane w komentarzach. MS Visual Studio nie obsługiwało specyfikacji %zu printf przed VS2013. Począwszy od VS2013 (np. _MSC_VER> = 1800) jest już dostępny %zu.

Jako alternatywę dla poprzednich wersji programu Visual Studio, jeśli drukujesz małe wartości (jak wielu elementów z pojemników STD) można po prostu oddanych do int i użyć% d:

printf("count: %d\n", (int)str.size()); // less digital ink spent 
// or: 
printf("count: %u\n", (unsigned)str.size()); 
+0

Jeśli celujesz w C++, użyłbym static_cast zamiast obsady stylu C. Jego główną zaletą jest to, że jest sprawdzane podczas kompilacji. – Tanaya

14

Kompilator C firmy Microsoft nie nadąża za najnowszymi standardami C. Jest to w zasadzie kompilator C89 z niektórymi wybranymi funkcjami od C99 (np. long long). Nic więc dziwnego, że coś nie jest obsługiwane (%zu pojawił się w C99).

4

Na podstawie odpowiedzi z here, %z jest dodatkiem C99. Ponieważ MSVC nie obsługuje żadnego z późniejszych standardów C, nie jest zaskoczeniem, że %z nie jest obsługiwane.

+0

Gdzieś (ja don ' t mają niestety odniesienie) MS stwierdziło, że będą * nigdy * wspierać C99. – john

+2

@john: zobacz np. http: // herbutter.com/2012/05/03/reader-qa-what-about-vc-and-c99 /. Ich kompilator nazywa się Visual C++, od wersji 1.0 i w przeciwieństwie do ich kompilatora Microsoft C/C++ w wersji DOS. – MSalters

+2

VS 2015 obsługuje C99. Zarówno w 2013, jak i 2015 roku obsługiwane jest '% zu'. –

15

Od The microsoft documentation

HH, J, Z, T i prefiksy długość nie są obsługiwane.

Stwierdza, że ​​poprawny przedrostek użyć do size_t ja - tak byłoby użyć %Iu

+7

VS 2015 obsługuje ''% z'' –

Powiązane problemy