以下 C 程序是否保证退出,0
或者是否允许编译器识别对象s
和t
彼此,就像 C++ 中允许的所谓的命名返回值优化(NRVO) 形式的复制省略一样?
typedef struct {
int i, j;
double a, b;
} S;
int result;
S test(S* q) {
S s = {0, 0, 0, 0};
result = &s == q;
return s;
}
int main(void)
{
S t = test(&t);
return result;
}
Clang 的退出与1
我的预期相反,请参阅https://godbolt.org/z/ME8sPGn3n。
(在 C++ 中,由于明确允许执行 NRVO,因此0
和都是有效结果。)1