C++中正確使用PRId64
阿新 • • 發佈:2019-01-03
SRS中廣泛使用PRId64實現32和64位系統通用。
c++使用PRID64,需要兩步:
- 包含標頭檔案:<inttypes.h>
- 定義巨集:__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
當然有跨平臺的方法:
其中,printf("abc" "def" “ghi")這樣寫多個字串是沒有問題的。#include <inttypes.h> printf("%" PRId64 "\n", value); // 相當於64位的: printf("%" "ld" "\n", value); // 或32位的: printf("%" "lld" "\n", value);
但是,死活都編譯不過,錯誤是:error: expected ‘)’ before ‘PRId64’
找了一下這個巨集的定義,/usr/include/inttypes.h:
原來這個是定義給c用的,C++要用它,就要定義一個__STDC_FORMAT_MACROS巨集顯示開啟它。/* 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"
/* 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++編譯,可以使用後者,否則可以用前者直接定義巨集。