2011-01-12 97 views
0

在我的C++應用程序,我有定義:C++鑄造的問題(結構)

struct socksddr_storage ss; 
struct sockaddr *sa; 

之間有什麼不同的以下內容:

sa = (struct sockaddr *)&ss; 

sa = (sockaddr *)&ss; 

? ?

任何幫助?

回答

1

有一個在C++作爲struct關鍵字沒有差別是可選的。在C中,第二種形式不合法。

6

還有就是兩者之間沒有什麼區別。與struct關鍵字目前的類型轉換重提C,其中一個結構類型包含關鍵字「結構」,這就是爲什麼那句「typedef結構」走紅的日子。 C++在此上下文中不再需要此關鍵字,但爲了向後兼容,保留了語法。

0

區別在於(struct sockaddr*)在C和C++中都是有效的轉換,其中(sockaddr*)在C++中有效,但在C中不存在。兩種轉換都獲得相同的結果。

0

正如其他人已經說過的,您不需要在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. 
0

我不能說肯定的事情,因爲我不知道你的實際情況下,但如果當你寫(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 
}