簡體   English   中英

在GNU系統中使用printf打印size_t

[英]Printing size_t using printf in GNU systems

在我閱讀這篇文章時 ,我發現了這一段:

同樣,不要做任何努力來滿足長度小於預定義類型(如size_t)的可能性。 例如,以下代碼是可以的:

printf ("size = %lu\n", (unsigned long) sizeof array);
printf ("diff = %ld\n", (long) (pointer2 - pointer1));

1989標准C要求它工作,我們只知道一個反例:Microsoft Windows上的64位程序。 我們將把它留給那些想要將GNU程序移植到該環境以便弄清楚如何操作的人。

1989標准C真的允許該代碼嗎?

問的問題是:

1989標准C真的允許該代碼嗎?

是的,如果通過“允許”我們的意思是“這將編譯並運行,做一些合理的事情而不會觸發未定義的行為”(而不是“這將做我想要的”)。 這兩個案例略有不同。

對於size_t ,如果結果太大,結果將被截斷。 對於ptrdiff_t ,如果結果太大,結果將是實現定義的。

但是,最新版本的Visual Studio( _MSC_VER >= 1800 )支持zt轉換(無論如何都是C ++ 11支持所必需的),因此您可以使用:

size_t size;
printf("size = %zu\n", size);
ptrdiff_t diff;
printf("diff = %td\n", diff);

這也適用於其他系統(GNU,BSD,Darwin)。 對於舊版本的Visual Studio,有其他選擇,但需要在不同平台上使用不同的格式字符串。

關於GNU編碼標准的說明

GNU編碼標准適用於GNU組織,它有一些非常具體的目標,並不關心支持Windows。 除非你有特定的理由要遵循它們(例如,你希望你的項目將來成為一個GNU項目),否則我會把它們的編碼標准放在一邊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM