在我的C++應用程序,我有定義:C++鑄造的問題(結構)
struct socksddr_storage ss;
struct sockaddr *sa;
之間有什麼不同的以下內容:
sa = (struct sockaddr *)&ss;
和
sa = (sockaddr *)&ss;
? ?
任何幫助?
在我的C++應用程序,我有定義:C++鑄造的問題(結構)
struct socksddr_storage ss;
struct sockaddr *sa;
之間有什麼不同的以下內容:
sa = (struct sockaddr *)&ss;
和
sa = (sockaddr *)&ss;
? ?
任何幫助?
有一個在C++作爲struct
關鍵字沒有差別是可選的。在C中,第二種形式不合法。
還有就是兩者之間沒有什麼區別。與struct關鍵字目前的類型轉換重提C,其中一個結構類型包含關鍵字「結構」,這就是爲什麼那句「typedef結構」走紅的日子。 C++在此上下文中不再需要此關鍵字,但爲了向後兼容,保留了語法。
區別在於(struct sockaddr*)
在C和C++中都是有效的轉換,其中(sockaddr*)
在C++中有效,但在C中不存在。兩種轉換都獲得相同的結果。
正如其他人已經說過的,您不需要在C++中編寫struct
前綴,因爲編譯器只能通過名稱確定正確的類型。但我認爲在這種情況下使用的reinterpret_cast,與C風格的轉換是大錘鑄其蒙上類型和常量符一氣呵成。
struct socksddr_storage ss;
const struct socksddr_storage ss2;
struct sockaddr *sa;
sa = reinterpret_cast<sockaddr *>(&ss); // Works like the C Cast
sa = reinterpret_cast<sockaddr *>(&ss2); // Fails, because ss2 is a constant,
// but sa is a pointer to a no const memory location. The C cast will allow
// this assignment, but this can lead to runtime errors since the linker
// can place ss2 into read-only memory.
我不能說肯定的事情,因爲我不知道你的實際情況下,但如果當你寫(sockaddr*)
和別當(struct sockaddr*)
, 我的回答可以申請你 看到一個錯誤。 struct sockaddr
在(struct sockaddr*)
是一個詳細類型說明符。 有時候這是必需的。 例如,
void f(void* p)
{
int stat(char const*, struct stat*);
struct stat *a = (struct stat*) p; // cannot omit this struct
}