2016-10-23 77 views
3

一個爲size_t假設你有下面的代碼片段:打印在一個獨立於操作系統的架構無關的方式

include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %lu", nodeID); 

這將沒有任何警告的情況下被提出的一個64位系統上,但會生成%的轉換警告在32位系統上。

我們可以使用%z modifier

然而,這並不在Visual Studio中,它使用「我」的修改工作,對付它。

是否有任何方法可以解決這兩個獨立於架構和獨立於操作系統的方式?

+0

如果在所有的CPU環境中'nodeID'確實具有相同的大小,會不會更好?你可以聲明'uint64_t'或'uint32_t'這個程序不會改變行爲,如果不希望它在x86和x64上運行不同的話。 –

+0

你可以用10個分區編寫自己的打印方法。 –

+2

''%zu''格式應該是標準和獨立的方式。不幸的是,Visual Studio C編譯器不得不根據以下標準跳過。最後幾個版本(2013和2015)應該具有完整的C99兼容性。 –

回答

5

正如你所說,你可以使用z修改:

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %zu\n", nodeID); 

但就像你說的IIRC這可能與舊的MS編譯器的兼容性問題。您可能能夠解決這個問題的東西,如:

#ifdef _MSC_VER /* Untested MSC detection */ 
#define PRIuSIZE Iu 
#else 
#define PRIuSIZE zu 
#endif 
#define QUOTE(name) #name 
#define STR(macro) QUOTE(macro) 
#define USIZE_STR STR(PRIuSIZE) 

#include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %" USIZE_STR "\n", nodeID); 

另一種方式,它是獨立在這個意義上,它並沒有在文件依賴條件預處理宏架構和操作系統,將是:

#include <stdio.h> 
#include <inttypes.h> 
size_t nodeID = 5; 
printf("nodeID = %" PRIu64 "\n", (uint64_t) nodeID); 

這顯然依靠size_t是小於或等於長度爲64位,我相信它始終是。

+1

「......我相信它總是如此。」 - Believe是一個糟糕的編程顧問。沒有上限。如果沒有'%zu',就沒有完全合規的方式 - 這就是爲什麼'%zu'被引入的原因。 – Olaf

+1

由於'size_t'不能大於'uintmax_t',所以可以強制使用'uintmax_t'並使用'PRIuMAX'來獲得正確的格式字母。但是如果你有''頭和'uintmax_t',那麼你也有'%zu'可用的機會很高。類似的評論也適用於'uint64_t'。 –

相關問題