在我的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
}