Почему формат% zd printf не работает в VS2010? - PullRequest
9 голосов
/ 11 июля 2011

Следующий фрагмент моего кода не печатает значение в visual studio.

int main() { 
    intptr_t P = 10;
    printf("test value is %zd",P);
    return 0;
}

ВЫВОД:

test value is zd

Я ожидаю, что приведенный выше код печати

test value is 10

Я использую intptr_t вместо целочисленного значения, чтобы код настраивался как в 32-битной, так и в 64-битной архитектуре.

Ответы [ 5 ]

4 голосов
/ 11 июля 2011

Хотя в C99 поддерживается спецификатор длины z, Visual Studio 2010 не поддерживает C99 и вместо этого соответствует более старой версии C, в которой отсутствует спецификатор длины z. В качестве расширения VS2010 поддерживает 1004 * спецификатор длины вместо size_t, но он не переносим на другие платформы.

Я бы рекомендовал использовать unsigned long long со спецификатором %llu; накладные расходы минимальны и переносимы на платформы C99.

4 голосов
/ 11 июля 2011

Префикс z не определен в версии Microsoft printf.Я думаю, что префикс I может работать.Смотри http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx

2 голосов
/ 12 июля 2011

Для переносимого кода, #include <inttypes.h> и используйте PRIdPTR в строке формата printf.

printf("test value is %" PRIdPTR, P);

Страница Википедии для inttypes.h содержит ссылку на версию этого файла, которая будет работать с Visual C ++ и, вероятно, также будет работать с VS2010 (если Microsoft не добавит inttypes. ч).

PRIdPTR для intptr_t, PRIuPTR для uintptr_t.

1 голос
/ 24 октября 2013

Visual C ++, начиная с VS 2013, не поддерживает% z.Если вы хотите, чтобы будущие версии поддерживали его, проголосуйте за эту ошибку:

https://connect.microsoft.com/VisualStudio/feedback/details/806338/vc-printf-and-scanf-should-support-z

0 голосов
/ 15 февраля 2016

Для печати size_t необходимо использовать % Iu в VS и% zu в gcc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...