OS X上的printf和%llu vs%lu

Ste*_* Lu 9 c++ macos types integer long-integer

可能重复:
如何printf uint64_t?

为什么在我的64位Mac上(我使用的是Clang)uint64_t类型是unsigned long long在64位Ubuntu上的uint64_t类型是unsigned long什么?

这使我很难接到我的printf调用,在两种环境下都不给出编译器警告(或者甚至工作).

我可以尝试使用宏来尽量选择正确的字符串(#define LU无论是%llu%lu,并在这个过程uglifying的printf串位),但在Mac上我有一个64位字长(所以_LP64会被定义UINTPTR_MAX != 0xffffffff),但它仍然long long用于64位int类型.

// printf macro switch (for the uint64_t's)
#if UINTPTR_MAX == 0xffffffff 
   // 32-bit
#  define LU "%llu"
#else 
   // assume 64-bit
   // special case for OS X because it is strange
   // should actually check also for __MACH__ 
#  ifdef __APPLE__
#    define LU "%llu"
#  else
#    define LU "%lu"
#  endif
#endif
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 6

已经为您定义了宏<cinttypes>.尝试

printf("%"PRIu64, x);
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用C++等功能

std::cout << x;
Run Code Online (Sandbox Code Playgroud)

这将为您的变量类型选择适当的<<运算符.


Gra*_*yer 5

答案是通过静态强制转换来提升:

some_type i = 5;
printf("our value is: %llu", (unsigned long long)i);
Run Code Online (Sandbox Code Playgroud)