[英]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
)支持z
和t
轉換(無論如何都是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組織,它有一些非常具體的目標,並不關心支持Windows。 除非你有特定的理由要遵循它們(例如,你希望你的項目將來成為一個GNU項目),否則我會把它們的編碼標准放在一邊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.