2013-12-12 5 views
29

Я в настоящее время использую явное приведение к длительному и использованию %ld для печати pid_t, есть спецификатор, такой как %z для size_t для pid_t?Как правильно Printf спецификатор для печати pid_t

Если нет, то лучший способ печати pid_t?

+1

Я получаю. % d hello.c: 9: 42: warning: format указывает тип 'long', но аргумент имеет тип 'pid_t' (aka 'int') [-Wformat] при попытке ld –

+0

@KorayTugay Обратите внимание на приведенные выше слова: «В настоящее время я использую явный перевод в long». –

ответ

14

Нет такого спецификатора. Я думаю, что вы делаете отлично ... вы можете использовать еще более широкий тип int, но нет никакой реализации, где pid_t больше, чем длинный и, вероятно, никогда не будет.

+0

Ницца. Если вы хотите настроить 'printf' со своей собственной спецификацией для' pid_t', посмотрите эту страницу: http://stackoverflow.com/questions/9260170/is-this-possible-to-customize-printf –

+0

Общее количество количество процессов, связанных с тем, как бит os? например, может ли у os больше sizeof (int)? –

+0

См. Http://stackoverflow.com/questions/1922761/size-of-pid-t-uid-t-gid-t-on-linux ... pid_t обычно составляет 32 бита, независимо от размера бит ОС. Система * может иметь большие, но я бы этого не ожидал. В любом случае, долго будет много для безопасности. –

2

С целыми типами, не имеющими спецификатора соответствующего формата, как в случае pid_t, но с известными знаками, отбрасываемыми до самого широкого совпадающего типа подписки и печати. Если знак неизвестен, отбрасывается на самый широкий неподписанный тип.

// C99 
#include <stdint.h> 

pid_t pid = foo(); 
printf("pid = %jd\n", (intmax_t) pid); 

// pre-C99 
pid_t pid = foo(); 
printf("pid = %ld\n", (long) pid); 
Смежные вопросы