0
struct s1 { int a; int b; };
struct s2 { int a; int b; };

struct s2 test(void) {
    struct s1 s = { 1, 2 };
    return s; // incompatible types
}

上記のコードでs、新しいstruct s2変数を作成してsの値を入力せずに戻ることはできますか? struct s1は常に と同一であることが保証されていstruct s2ます。

4

4 に答える 4

6

構造体を直接返すことはできませんが、C99 の機能である複合リテラルを使用することで、ソース コードで別の変数を作成することを回避できます。

struct s2 test(void) {
  struct s1 s = { 1, 2 };
  return (struct s2){s.a, s.b};
}
于 2012-08-29T15:14:42.817 に答える
0

nos answerのほかに..注:[デモのみの場合、回答ではありません]

これは本当に悪い方法です(推奨されません)が、コンパイラをだますことができます:-

struct s1 { int a; int b; };
struct s2 { int a; int b; };
struct s2 test(void) 
{
     struct s1 s = { 1, 2 };
     return *((struct s2*)(void*)&s);  
}

その動作はコンパイラのみに依存します。s1 と s2 が同じように配置されている場合、これは機能します。

于 2012-08-29T15:22:21.127 に答える
-1

あなたのコメントが示唆するように、コンパイラエラーが発生していると思います。return ステートメントをキャストすることをお勧めします。

return (struct s2) s;

本能的に機能するはずです。そうでない場合は、コンパイラを微調整して、エラーを警告にすることでチェックをスキップできます。好奇心のために、なぜこれが必要なのですか?

于 2012-08-29T15:14:24.983 に答える
-2

キャストで戻ることはできますが、そうすべきではありません。

メモリ レベルで s2 を s1 として忠実に解釈できるように、バイトがまったく同じであると確信しているため、ここではキャストが機能します。

ただし、誰かが s2 に新しいフィールドを追加すると、これはひどく壊れます。プログラミングまたはソフトウェア エンジニアリングの観点からは、変換する必要があります。s1 と s2 の互換性が維持されることを本当に期待している場合は、コピー ctor またはトランスレータを作成する必要があります。または、あるものから別のものに取得するもの。

于 2012-08-29T15:11:49.463 に答える