2017-06-20 21 views
0

我有一個文件將被捆綁到兩個共享庫中。編譯器創建了兩個版本的庫:一個用於32位類型,另一個用於64位類型。現在我需要打印診斷日誌涉及的變量:針對兩種不同變體處理的庫的Wformat

size_t len; 

和打印語句格式說明如下:

LOG("The length is %ld",len); 

當編譯器創建它抱怨一個64位版本:

format specifies type 'unsigned int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] 

如果我將它從%ld更改爲%lu,則32位版本會提示:

format specifies type 'unsigned long' but the argument has type 'size_t' (aka 'unsigned int') [-Wformat] 

如何避免-Wformat錯誤(當然抑制它不是我正在尋找的解決方案)?我是否必須訴諸#ifdefs來檢查編譯器版本並相應地編寫診斷?

編譯器版本:3.8鏘(安卓平臺)

編輯:有人它複製到一個相關的問題。讓我自爲size_t似乎是常見的有一個不同的例子姿勢時:

jlong val; 
LOG("val = %ld",val): 

在運行32位編譯器通:

warning: format specifies type 'long' but the argument has type 'jlong' (aka 'long long') [-Wformat] 

所以,如果我試圖將其更改爲%LLD壓制,然後警告我得到: 當運行64位傳:

warning: format specifies type 'long long' but the argument has type 'jlong' (aka 'long') [-Wformat] 

如何應對這種情況?並再次重申:

編譯器版本:3.8鏘(安卓平臺)

+0

我假設'LOG'只是一個圍繞'std :: printf'的包裝宏? – Rakete1111

+0

是的你是對的,它是一個包裝。 – Zoso

回答

0

如果您有支持C++ 17編譯器,你可以做這樣的事情。

enum class Environment { bit32, bit64 }; 

#ifdef __x86_32__ 
constexpr Environment environment = Environment::bit32; 
#elif __x86_64__ 
constexpr Environment environment = Environment::bit64; 
#endif 

void print_statement() 
{  
    if constexpr (environment == Environment ::bit32) { 
    // do your 32 bit thing. 
    } 
    else if constexpr (environment == Environment ::bit64) { 
    // do your 64 bit thing. 
    } 
} 
相關問題