C ++铸造问题(结构)

时间:2011-01-12 09:27:43

标签: c++ casting struct

在我的C ++应用程序中,我有定义:

struct socksddr_storage ss;
struct sockaddr *sa;

以下内容有何不同:

sa = (struct sockaddr *)&ss; 

sa = (sockaddr *)&ss;

???

任何帮助?

5 个答案:

答案 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
}