1. 程式人生 > >C++中正確使用PRId64

C++中正確使用PRId64

SRS中廣泛使用PRId64實現32和64位系統通用。

c++使用PRID64,需要兩步:

  1. 包含標頭檔案:<inttypes.h>
  2. 定義巨集:__STDC_FORMAT_MACROS,可以通過編譯時加-D__STDC_FORMAT_MACROS,或者在包含檔案之前定義這個巨集。

int64_t用來表示64位整數,在32位系統中是long long int,在64位系統中是long int,所以列印int64_t的格式化方法是:

printf("%ld", value); // 64bit OS
printf("%lld", value); // 32bit OS
當然有跨平臺的方法:
#include <inttypes.h>
printf("%" PRId64 "\n", value);
// 相當於64位的:
printf("%" "ld" "\n", value);
// 或32位的:
printf("%" "lld" "\n", value);
其中,printf("abc" "def" “ghi")這樣寫多個字串是沒有問題的。

但是,死活都編譯不過,錯誤是:error: expected ‘)’ before ‘PRId64’

找了一下這個巨集的定義,/usr/include/inttypes.h:

/* The ISO C99 standard specifies that these macros must only be
   defined if explicitly requested.  */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS

# if __WORDSIZE == 64
#  define __PRI64_PREFIX    "l"
#  define __PRIPTR_PREFIX   "l"
# else
#  define __PRI64_PREFIX    "ll"
#  define __PRIPTR_PREFIX
# endif

/* Macros for printing format specifiers.  */

/* Decimal notation.  */
# define PRId8      "d"
# define PRId16     "d"
# define PRId32     "d"
# define PRId64     __PRI64_PREFIX "d"
原來這個是定義給c用的,C++要用它,就要定義一個__STDC_FORMAT_MACROS巨集顯示開啟它。
/* test_int64.cpp
g++ -D__STDC_FORMAT_MACROS -o test_int64 -g -O0 test_int64.cpp
*/
#include <stdio.h>
#include <inttypes.h>

int main(int argc, char** argv){
    int64_t value = 0xFFFFFFFFFFFF;
    printf("int64_t=%"PRId64", sizeof(int64_t)=%d\n", value, sizeof(int64_t));
}

編譯並執行:

g++ -D__STDC_FORMAT_MACROS -o test_int64 -g -O0 test_int64.cpp

./test_int64

int64_t=281474976710655, sizeof(int64_t)=8

對於C++新標準-std=c++0x,還可以使用更好的方式:

/* test_int64_1.cpp 
g++ -o test_int64_1 -g -O0 test_int64_1.cpp
*/
#include <stdio.h>
#include <cinttypes>
using namespace std;

int main(int argc, char** argv){
    int64_t value = 0xFFFFFFFFFFFF;
    printf("int64_t=%"PRId64", sizeof(int64_t)=%d\n", value, sizeof(int64_t));
}
不用定義那個巨集了,編譯和執行:

g++ -o test_int64_1 -g -O0 test_int64_1.cpp -std=c++0x

./test_int64_1

int64_t=281474976710655, sizeof(int64_t)=8

當然得指定一個新的引數:-std=c++0x,否則會報錯“#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.”

若能使用較新的g++編譯,可以使用後者,否則可以用前者直接定義巨集。