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不创建新变量并用'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

除了没有答案..注意:[仅供演示,它不是答案]

这是一种非常糟糕的方法(不建议),但它可以欺骗编译器:-

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 回答