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
相同。
答案 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或翻译或其他任何东西从一个到另一个。