In one of my previous post, I mentioned about an ugly #ifdef workaround for printing definitive types like uint64_t. However this is not at all required :-). There is already format specifiers for these types in inttypes.h! It contains ARCH independent format specifiers for many definitive types like uint64_t, uint32_t, uint16_t etc.. and their signed counterparts too!
A quick glance around the header file is below! It is located in "/usr/include/inttypes.h"
/* Unsigned decimal notation. */
# define SCNu8 "hhu"
# define SCNu16 "hu"
# define SCNu32 "u"
# define SCNu64 __PRI64_PREFIX "u"
and __PRI64_PREFIX is defined as
# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# define __PRIPTR_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# define __PRIPTR_PREFIX
# endif
There are several such macros for many types and variants (hex, octal etc..). Glance through the header if you are interested further!
A quick short program.
#include <stdio.h>
#include <inttypes.h>
int main()
{
uint64_t test = 0x12345678;
printf("%"SCNu64" : %"SCNx64"\n", test, test);
}
Output: 305419896 : 12345678
and no warnings too ;-)
A quick glance around the header file is below! It is located in "/usr/include/inttypes.h"
/* Unsigned decimal notation. */
# define SCNu8 "hhu"
# define SCNu16 "hu"
# define SCNu32 "u"
# define SCNu64 __PRI64_PREFIX "u"
and __PRI64_PREFIX is defined as
# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# define __PRIPTR_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# define __PRIPTR_PREFIX
# endif
There are several such macros for many types and variants (hex, octal etc..). Glance through the header if you are interested further!
A quick short program.
#include <stdio.h>
#include <inttypes.h>
int main()
{
uint64_t test = 0x12345678;
printf("%"SCNu64" : %"SCNx64"\n", test, test);
}
Output: 305419896 : 12345678
and no warnings too ;-)