2011-12-01 39 views
0

嘗試使用%zu轉換說明符以十進制形式輸出指針地址。按預期運行,但gcc警告格式'%zu'期望類型'size_t',但參數4的類型爲'long int *'。在問題中顯示使用的gcc選項。 gcc仍然警告沒有任何選項設置(除了-std = c99)。然而,鏗鏘聲根本不會發出任何警告,並且具有相同的選項。這是在OS X 10.7上。只是好奇鏗鏘爲什麼不發出任何警告?調試/編譯gcc比clang更「好」嗎?gcc -W -Wall -O -pedantic -std = c99 vs clang具有相同選項

+1

我不認爲標準要求printf格式的警告。這不是一個類型安全的功能,所以最終的負擔是*你*使用它的權利。 –

+0

這是有道理的... – spinozagl

+0

我想你知道正確的格式說明符是'%p',即使這樣一個強制類型轉換爲'void *'。 –

回答

2

這似乎是特定於鐺的z大小改性劑;你獲得與%lu%u%hu等的警告(即使沒有任何選項)

一般來說,它一直是我的經驗,鐺比GCC做更多有用的警告消息。這是該經歷的一個例外。我會提交一個錯誤。

0

你需要進行轉換,但要注意,如果你的代碼在size_t與指針的大小不一樣的機器上運行,那麼它會做錯誤的事情。也許還不錯,但...

printf ("%zu\n", (size_t)my_ptr); 
+0

nope,轉換爲size_t不會按預期輸出指針地址。例如,如果將長指針遞增到long數組上,則轉換爲size_t將顯示僅地址相差一個字節的地址。它們在我的機器上按順序相隔8個字節。 – spinozagl

+0

@spinozagl,這是不正確的。 –

+0

有什麼不正確?那長地址相距8個字節? – spinozagl

相關問題