我在分析SKIA的源代碼時,發現了這個問題:
constexpr unsigned kMaxBytesInUTF8Sequence = 4。
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr)。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我知道(如果我錯了,請原諒我),char utf8[kMaxBytesInUTF8Sequence]會衰減為char*,正如char utf8[]或只是char* utf8。
因此,我認為這樣寫是沒有意義的,對嗎?
uj5u.com熱心網友回復:
一個具有陣列型別的函式引數被編譯器調整為指向陣列元素型別的指標。
因此,這些函式的宣告
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr)。
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[10] = nullptr)。
SK_SPI size_t ToUTF8(SkUnichar uni, char *utf8 = nullptr)。
宣告相同的一個函式。
這個引數宣告
char utf8[kMaxBytesInUTF8Sequence]
用于自我演示,指定傳遞的陣列不能大于kMaxBytesInUTF8Sequence元素,或者用戶可以傳遞一個空指標。
uj5u.com熱心網友回復:
在一個函式引數中,陣列符號只是一種語法糖。 大括號內指定的大小被忽略了,實際的引數型別只是一個指標。
換句話說,這個宣告:
constexpr unsigned kMaxBytesInUTF8Sequence =4;
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char utf8[kMaxBytesInUTF8Sequence] = nullptr)。
被編譯器處理為:
constexpr unsigned kMaxBytesInUTF8Sequence = 4;
// ...
SK_SPI size_t ToUTF8(SkUnichar uni, char* utf8 = nullptr)。
然而,用陣列符號指定引數宣告對程式員來說是一種檔案說明,即該函式期望傳入一個至少kMaxBytesInUTF8Sequence大小的char[]陣列。 但是,編譯器并沒有做任何事情來實際驗證這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/315450.html
標籤:
