我正在嘗試為 C 中的 WebExtension 瀏覽器插件撰寫本機主機客戶端。
我找了一些例子,不幸的是只找到了幾個。
我正在關注這個簡單好看的一個,但我不明白構造字串的部分如下:
json get_message() {
char raw_length[4];
fread(raw_length, 4, sizeof(char), stdin);
uint32_t message_length = *reinterpret_cast<uint32_t*>(raw_length);
if(!message_length)
exit(EXIT_SUCCESS);
char message[message_length];
fread(message, message_length, sizeof(char), stdin);
string m( message, message sizeof message / sizeof message[0] );
return json::parse(m);
}
我查看了 C std::string 建構式的多個檔案,但我不知道這里到底發生了什么。
做什么string m( message, message sizeof message / sizeof message[0] );?
為什么不只是做string m(message)呢?
還有char message[message_length];一行讓我感到困惑,因為message_length它不是一個常數,但顯然這是一個 GCC 特有的特性。
uj5u.com熱心網友回復:
做什么
string m( message, message sizeof message / sizeof message[0] );?
message衰減為指向第一個元素的指標,sizeof message / sizeof message[0]是陣列中元素的數量,并且message sizeof message / sizeof message[0]是指向陣列末尾的指標。請注意,這是獲取元素數量的不必要的復雜方式。我建議message message_length改用。
建構式從這些迭代器(指標)之間的范圍內復制所有字符。迭代器跨越整個陣列。
我不明白的是我似乎找不到一個接受 (char*, char*) 的 std::string 建構式
建構式看起來像這樣(簡化):
template<class InputIt>
string(InputIt first, InputIt last);
模板引數是char*從引數推匯出來的。
為什么不只是做
string m(message)呢?
該建構式要求message以空字符終止。如果引數不是由空字符終止,那么程式的行為將是未定義的。那會很糟糕。
此外,如果陣列確實包含空終止字符,則該建構式不會將它們復制到字串中,而迭代器范圍建構式會這樣做。如果打算復制空終止符,那將是不好的。
還有一條令
char message[message_length];我困惑的線because message_length不是一個常數
這在 C 中是不允許的。該程式格式不正確。
由于示例質量較差,因此這里有一個修復主要問題的版本:
json get_message(std::istream& in)
{
std::uint32_t message_length;
// NOTE input is assumed to be in native byte order
in.read(reinterpret_cast<char*>(&message_length), sizeof message_length);
if (!in)
throw std::runtime_error("Invalid message length");
if (!message_length)
throw std::runtime_error("No input");
std::string m('\0', message_length);
in.read(m.data(), message_length);
if (!in)
throw std::runtime_error("Invalid message");
return json::parse(m);
}
如果要使用其他錯誤處理而不是例外,您可以進行調整。演示的錯誤處理有改進的空間(獨特的例外類等)。
與原始示例最顯著的偏差是該函式可以從任何輸入流中讀取;不僅是標準輸入。我選擇這樣做不僅是因為它更通用,還因為實際上沒有標準 便攜的方式來從標準輸入讀取二進制檔案。參見C 讀取二進制標準輸入
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473922.html
下一篇:如何將空格替換為字串中的亂數
