2011-01-12 4 views
0

をキャスト++私は定義を持っているアプリケーション:C++私のCでの質問(構造体)

struct socksddr_storage ss; 
struct sockaddr *sa; 

次の間で異なるものです:

sa = (struct sockaddr *)&ss; 

sa = (sockaddr *)&ss; 

? ?

助けが必要ですか?

答えて

1

structキーワードはオプションであるため、C++には違いはありません。 Cでは、2番目の形式は合法ではありません。

6

2つの間に違いはありません。 structキーワードの型キャストは、構造体の型にキーワード "struct"が含まれていて、 "typedef struct"というフレーズが普及したCの時代にまで遡ります。 C++では、この文脈でこのキーワードの必要性がなくなりましたが、下位互換性のために構文を維持していました。

0

違いは(struct sockaddr*)はCとC++の両方で有効なキャストで、(sockaddr*)はCでは有効ですがCでは有効ではありません。両方のキャストで同じ結果が得られます。

0

すでに述べたように、コンパイラは名前だけで正しい型を判断できるので、他の人はすでに述べたように、structという接頭辞をC++に書く必要はありません。しかし、このような状況で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. 
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 
}