2017-10-12 46 views
3

strlen返回的是size_t,即long unsigned int爲什麼在將strlen的輸出存儲在int中時不會發出警告?

爲什麼編譯下面的代碼不會發出關於slen的簽名的警告?

char msg[] = "Hello"; 
int slen= strlen(msg); 

(我預計long unsigned int slen也有必要避免這樣的警告。)

+3

可能取決於您的編譯器設置。 –

+5

因爲它不必。這種轉換是完全合法的。 –

+1

['-Wconversion'](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)對於GCC – DaBler

回答

6

C和C++語言讓你可以複製所有的不同類型之間的整數而不發出警告(編譯器可以給你一個警告默認情況下,一些做char,這是一個臭名昭着的例外)。

使用gcc您可以使用此警告以避免丟失高位(因此long longint會在32位計算機上發出警告)。

gcc ... -Wstrict-overflow ... 

還有一個標誌,以防止自動轉換:

gcc ... -Wno-int-conversion ... 

這很可能造成大量的編譯問題,但它可以是一個好主意,以測試你的代碼(A 皮棉類型的東西)。

看看gcc手冊會給你關於這些警告的其他細節。

請注意,您也可以使用-Werror標誌將警告轉換爲錯誤。這種方式編譯失敗,而不是讓你繼續你會考慮一個錯誤的東西。

+4

「默認情況下,C和C++允許您在沒有警告的情況下在所有不同類型之間複製整數」 - 更準確地說,該語言不需要*警告。編譯器可以警告任何他們喜歡的東西,C標準沒有說明編譯器的默認行爲應該是什麼。它只是要求符合規範的編譯器針對違反語法規則和約束的情況發出診斷信息(事實並非如此) - 許多編譯器默認情況下甚至不符合要求。 –

-3

strlen是一個字符串函數,這意味着它期望您提供一個地址作爲參數。沒有括號的msg意味着你將第一個元素的地址作爲參數。 strlen函數將計算不包含終止空字符的數組中的字的數量,從某種意義上說,您將返回一個int,在此示例中slen = 5

+0

這是多個字節,而不是單詞。自Win2k以來,USC-16已經不再使用了,它會是一些字(每個字符2個字節)。 –

+0

字符數,而不是字數,我不覺得這個答案爲什麼沒有警告。 'strlen'也返回一個'size_t',而不是'int'。 –

+0

@RetiredNinja,no,'strlen()'只是計算字節並停在第一個''\ 0'處。您需要一個多字節函數來計算'wchar_t'(Windows上的文字,wcslen()')或UTF-8字符串('mbslen()')中的字符。 –

相關問題