在我的C ++应用程序中,我有定义:
struct socksddr_storage ss;
struct sockaddr *sa;
以下内容有何不同:
sa = (struct sockaddr *)&ss;
和
sa = (sockaddr *)&ss;
???
任何帮助?
答案 0 :(得分:6)
两者之间没有区别。带有struct关键字的类型转换可以追溯到C的时代,其中结构的类型包括关键字“struct”,这就是短语“typedef struct”变得流行的原因。 C ++在此上下文中消除了对此关键字的需求,但保留了语法以实现向后兼容性。
答案 1 :(得分:1)
C ++没有区别,因为struct
关键字是可选的。在C中,第二种形式是不合法的。
答案 2 :(得分:0)
区别在于(struct sockaddr*)
是C和C ++中的有效强制转换,其中(sockaddr*)
在C ++中有效但在C中无效。两个强制转换都实现相同的结果。
答案 3 :(得分:0)
正如其他人已经说过的那样,您不需要在c ++中编写struct
前缀,因为编译器只能通过名称来确定正确的类型。但是我建议在这种情况下使用reinterpret_cast,因为c样式转换是一个大锤子转换,它一次性转换类型和const说明符。
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.
答案 4 :(得分: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
}