返回相同的结构但具有不同的名称

时间:2012-08-29 15:10:33

标签: c c99

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 个答案:

答案 0 :(得分:6)

您不能直接返回结构,但可以避免 使用compound literal在源代码中创建单独的变量, 这是C99的一个特色。

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

答案 1 :(得分:0)

除了nos回答 .. 注意:[仅适用于演示,不是答案]

这是一个真正糟糕的方法(不建议),但它可以解析编译器: -

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的排列方式相同,则可行。

答案 2 :(得分:-1)

我想,正如你的建议所暗示的那样,你得到了一个编译器错误。 我建议你施放回报声明:

return (struct s2) s;

它应该本能地发挥作用。如果不是,您可以调整编译器以通过使错误成为警告来跳过检查。 只是出于好奇,你为什么需要这个?

答案 3 :(得分:-2)

你可以通过施法返回,但不应该。

Casting将在这里工作,因为您确信字节将完全相同,以便在内存级别s2可以忠实地解释为s1。

然而,如果有人在s2中添加了一个新字段,这将会破坏,等等。从编程或软件工程的角度来看,你应该转换,如果你真的希望s1和s2保持兼容,你应该写一份副本ctor或翻译或其他任何东西从一个到另一个。