2011-01-12 150 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 
}