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
。
您不能直接返回结构,但可以避免在源代码中创建单独的变量,方法是使用复合文字,这是 C99 的一个特性。
struct s2 test(void) {
struct s1 s = { 1, 2 };
return (struct s2){s.a, s.b};
}
除了没有答案..注意:[仅供演示,它不是答案]
这是一种非常糟糕的方法(不建议),但它可以欺骗编译器:-
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 的排列方式相同,那么这是可行的。
我想,正如您的评论所暗示的,您遇到了编译器错误。我建议您使用 return 声明:
return (struct s2) s;
它应该工作,本能地。如果不是这样,您可以调整编译器以通过将错误设为警告来跳过检查。只是出于好奇,你为什么需要这个?
您可以通过投射返回,但不应该。
转换将在这里起作用,因为您确信字节将完全相同,因此在内存级别上,s2 可以忠实地解释为 s1。
但是,如果有人在 s2 中添加了一个新字段,这将非常糟糕,等等。从编程或软件工程的角度来看,您应该转换,如果您确实希望 s1 和 s2 保持兼容,您应该编写一个副本 ctor 或翻译器或从一个到另一个的任何东西。